What\'s the best way for implementing the java.awt.event.ActionListener
interface?
Have your class implement ActionListener and add this as an ActionLis
Some (jeanette/kleopatra) say to almost never use ActionListener, and to instead use Actions such as an AbstractAction. It's almost always a bad ideal to have your GUI class implement your listeners though as this breaks the Single Responsibility Principle and makes your code more difficult to maintain and extend,and so I strongly urge you not to do that.
So for example, an inner class for this:
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");
}
}
}
The second option (anonymous class) is certainly better, another option would be to have a nested class within Foo
.
I wouldn't go with the first option for two reasons:
Foo
shouldn't have to know that it implements ActionListener
.It depends. If you want to reuse the ActionListener
across multiple components, option one is better. If the ActionListener
will only ever be associated with the one button, option two is fine.
Generally, you would create a separate class (or inner class), if you anticipate some growth in the project. There's no need for Foo
to implement ActionListener
.