elias elias - 4 months ago 22
Java Question

Should your class implement ActionListener or use an object of an anonymous ActionListener class

What's the best way for implementing the

java.awt.event.ActionListener
interface?

Have your class implement ActionListener and add this as an ActionListener:

class Foo implements ActionListener{

public Foo() {
JButton button = new JButton();
button.addActionListener(this);
}

public void actionPerformed(ActionEvent e) {

}
}


Or add an object of an anonymous ActionListener class:

class Foo{

public Foo() {
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

}
});
}
}

Answer

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");
      }
   }

}