addactionlistener - java events
¿Debería su clase implementar ActionListener o usar un objeto de una clase anónima ActionListener? (3)
Algunos (jeanette / kleopatra) dicen que casi nunca usan ActionListener, y en su lugar usan Acciones como AbstractAction. Casi siempre es un mal ideal que su clase de GUI implemente a sus oyentes, ya que esto rompe el Principio de Responsabilidad Única y hace que su código sea más difícil de mantener y extender, por lo que le recomiendo encarecidamente que no lo haga.
Así, por ejemplo, una clase interna para esto:
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");
}
}
}
¿Cuál es la mejor manera de implementar la interfaz java.awt.event.ActionListener
?
Haga que su clase implemente ActionListener y agregue esto como ActionListener:
class Foo implements ActionListener{
public Foo() {
JButton button = new JButton();
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
}
}
O agrega un objeto de una clase anónima ActionListener:
class Foo{
public Foo() {
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
}
}
Depende. Si desea reutilizar el ActionListener
en múltiples componentes, la opción uno es mejor. Si el ActionListener
solo se asociará con un botón, la opción dos está bien.
Generalmente, crearía una clase separada (o clase interna), si anticipa algún crecimiento en el proyecto. No hay necesidad de que Foo
implemente ActionListener
.
La segunda opción (clase anónima) es ciertamente mejor, otra opción sería tener una clase anidada dentro de Foo
.
Yo no iría con la primera opción por dos razones:
- Los usuarios de
Foo
no deberían tener que saber que implementaActionListener
. - No puedes implementar dos escuchas diferentes en la misma clase.