Несколько JButton, один Eventlistener в Java - PullRequest
1 голос
/ 17 ноября 2011

У меня есть 2D-массив JButtons

JButton[][] ledBtns = new JButton[8][8];

И в цикле, я делаю все вещи инициализации. Теперь я хочу добавить EventListener для каждого JButton, который срабатывает при нажатии кнопки. Затем я хочу изменить изображение на кнопке.

for(int i = 0; i < ledBtns.length; i++){
  for(int j = 0; j < ledBtns[i].length; j++){
     //init stuff
     ledBtns[i][j].addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent evt) {
       changeImage();
  }
});
  }
}

Теперь вызывается метод changeImage (), но мне нужно знать, какая кнопка вызывала его. Я не могу использовать параметры, если я это сделаю, он скажет мне объявить их как «окончательные». Есть ли другой способ, кроме написания 64 методов, которые делают то же самое, и добавления их вручную к каждому из JButtons?

Ответы [ 4 ]

3 голосов
/ 17 ноября 2011

Класс ActionEvent имеет метод getSource(), используемый для получения компонента, который сгенерировал событие.

2 голосов
/ 17 ноября 2011

Вы можете установить свойство "name" объекта JButton и, согласно ответу mre, вы можете вызвать метод getSource ().Таким образом, вы можете идентифицировать кнопку, которую нажимали

2 голосов
/ 17 ноября 2011

Самый простой способ сделать это - просто объявить два временных финальных целых и ссылаться на них.

for(int i = 0; i < ledBtns.length; i++){
  for(int j = 0; j < ledBtns[i].length; j++){
    //init stuff
    final int finalI = i;
    final int finalJ = j;
    ledBtns[i][j].addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
      changeImage(finalI,finalJ);
    }
  });
}
0 голосов
/ 17 ноября 2011

Другой вариант заключается в том, чтобы ваш класс реализовывал ActionListner (то есть implements ActionListner).

Затем, когда вы циклически переключаете свои кнопки в цикле, вы можете просто сказать ledBtns[i][j].addActionListener(this).

* 1006.* Конечно, тогда вы должны выяснить, какой объект был источником события (обычно с использованием if...else блоков).Теперь это может быть громоздким для 64 объектов, но для более мелких предметов это обычно не проблема.

Или, вы можете получить вызов метода actionPerformed, изменить изображение и передать объект кнопки и т. Д.продолжайте свою работу.

То, что я предложил, это просто еще один вариант.Я сделал бы то, что имеет смысл для вашего кода и является самым чистым и наиболее читаемым.

...