Если ваш класс реализует ActionListener или использует объект анонимного класса ActionListener
Каков наилучший способ реализации интерфейса java.awt.event.ActionListener
?
Попросите свой класс реализовать ActionListener и добавьте его как ActionListener:
class Foo implements ActionListener{
public Foo() {
JButton button = new JButton();
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
}
}
Или добавить объект анонимного класса ActionListener:
class Foo{
public Foo() {
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
}
}
Ответы
Ответ 1
Некоторые (jeanette/kleopatra) говорят, что почти никогда не используют ActionListener и вместо этого используют Actions, такие как AbstractAction. Это почти всегда плохой идеал, когда ваш GUI-класс реализует ваших слушателей, хотя это нарушает принцип единой ответственности и делает ваш код более сложным для поддержания и и поэтому я настоятельно призываю вас не делать этого.
Так, например, для этого используется внутренний класс:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
class Foo {
public Foo() {
JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A));
}
private class ButtonAction extends AbstractAction {
public ButtonAction(String name, Integer mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("button pressed");
}
}
}
Ответ 2
Второй вариант (анонимный класс), безусловно, лучше, другой вариант - иметь вложенный класс внутри Foo
.
Я бы не пошел с первым вариантом по двум причинам:
- Пользователям
Foo
не нужно знать, что он реализует ActionListener
.
- Вы не можете реализовать двух разных слушателей в одном классе.
Ответ 3
Это зависит. Если вы хотите повторно использовать ActionListener
для нескольких компонентов, вариант лучше. Если ActionListener
будет ассоциироваться только с одной кнопкой, вариант 2 в порядке.
Как правило, вы должны создать отдельный класс (или внутренний класс), если вы ожидаете некоторого роста в проекте. Нет необходимости в Foo
для реализации ActionListener
.