当我创建一个ActionListener时,例如。对于一个按钮,我必须创建一个ActionListener的实例。特别是当我有几个按钮我说
button1.addActionListener(new MyOwnListener());
和代码中的其他地方我只是创建另一个实例
button2.addActionListener(new MyOwnListener());
因为我懒得两次使用同一个实例。
然而,当您创建这么多无用的实例时,这不是浪费空间。为什么监听器不能是静态的?
MyOwnListener.actionPerformed(event);
而不是
yetAnotherInstance.actionPerformed(event);
我无法想象这是不可行的。您不需要区分同一个类的监听器,只需创建实例,因为必须这样做。
我希望你得到我想说的话,即使我的英语不好。
答案 0 :(得分:0)
如果您创建静态侦听器方法,如何在事件发生时告诉您的按钮调用该方法?没有像函数指针那样可以传递给按钮的addActionListener(...)
方法。
(从java 8开始,有这样的事情,但这是另一个故事)。
在大多数情况下,不同的按钮具有不同的含义,并且应该执行不同的代码。
将所有代码放在静态方法中与面向对象编程无关。这不一定是坏事,但证明你做错了......
如果您害怕拥有相同侦听器的太多实例,请分享它们!懒惰不是编程错误的借口。 (但如果您共享实例,请确保他们不会保留您不想分享的任何状态信息!)
从Java 8开始,您可以这样做:
button1.addListener(MyOwnListener ::的actionPerformed); button2.addListener(MyOwnListener ::的actionPerformed);
快乐?
答案 1 :(得分:0)
您可以使用单个实例!它只是一团糟,因为它是一个单片事件处理程序。
示例:强>
MyOwnListener myOwnListener = new MyOwnListener();
button1.addActionListener(myOwnListener);
button2.addActionListener(myOwnListener);
在哪种情况下
public class MyOwnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1) {
executeCodeForButton1();
} else if(e.getSource() == button2) {
executeCodeForButton2();
}
}
}
多个按钮变得有点混乱,并且难以重构。
编辑:一个实例和全局对象,单例模式
public class YourFrame extends JFrame {
JButton button1;
JButton button2;
public YourFrame() {
...
button1 = new JButton("Hello");
button2 = new JButton("World");
button1.addActionListener(YourOwnListener.INSTANCE);
button2.addActionListener(YourOwnListener.INSTANCE);
}
public static enum YourOwnListener implements ActionListener {
INSTANCE;
private YourOwnListener() {}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button1) {
executeMethodForButton1();
} else if(e.getSource() == button2) {
executeMethodForButton2();
}
}
}
}
但这也是使用一个实例。这是因为他们正在实施Observer
模式。侦听器实现表示执行操作时运行的函数,这类似于Javascript中的函数或C / C ++中的函数指针。