简体   繁体   中英

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) {

            }
        });
    }
}

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:

  • The users of Foo shouldn't have to know that it implements ActionListener .
  • You cannot implement two different listeners in the same class.

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 .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM