Должен ли ваш класс реализовать 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) {
}
});
}
}
3 ответа
Некоторые (jeanette/kleopatra) говорят, что они почти никогда не используют ActionListener, а вместо этого используют такие действия, как 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");
}
}
}
Второй вариант (анонимный класс), безусловно, лучше, другой вариант будет иметь вложенный класс в Foo
,
Я бы не стал использовать первый вариант по двум причинам:
- Пользователи
Foo
не должен знать, что он реализуетActionListener
, - Вы не можете реализовать двух разных слушателей в одном классе.
Это зависит. Если вы хотите повторно использовать ActionListener
по нескольким компонентам, первый вариант лучше. Если ActionListener
только когда-либо будет связан с одной кнопкой, второй вариант в порядке.
Обычно вы создаете отдельный класс (или внутренний класс), если ожидаете некоторый рост в проекте. Там нет необходимости для Foo
реализовать ActionListener
,