您的类应该实现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) { } }); } }
一些人(jeanette / kleopatra)说几乎从不使用ActionListener,而是使用诸如AbstractAction之类的Action。 尽管让你的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
。