Java ActionListener最佳实践
Java ActionListener最佳实践,java,swing,package,actionlistener,Java,Swing,Package,Actionlistener,很抱歉标题太笼统了 我已经阅读了Java教程,也已经阅读了,但我仍然有一些疑问:我想知道当我必须多次执行相同的操作时,哪种解决方案是最好的 我希望重用相同的ActionListener,但我不确定如何以最佳方式实现这一点(就代码可读性、代码可维护性、性能和代码风格而言) 首先是“标准”代码(如果我不打算重用动作侦听器,我会使用该代码): 这样我就不能重用任何obv,因为它是一个匿名的内部类 现在,我可以想到以下解决方案: 在字段中存储匿名内部类的引用(很可能是静态final) 编写一个实现Act
很抱歉标题太笼统了 我已经阅读了Java教程,也已经阅读了,但我仍然有一些疑问:我想知道当我必须多次执行相同的操作时,哪种解决方案是最好的 我希望重用相同的
ActionListener
,但我不确定如何以最佳方式实现这一点(就代码可读性、代码可维护性、性能和代码风格而言)
首先是“标准”代码(如果我不打算重用动作侦听器,我会使用该代码):
这样我就不能重用任何obv,因为它是一个匿名的内部类
现在,我可以想到以下解决方案:
静态final
)李>
ActionListener
接口的新类public static final MENU_ACTION_LISTENER = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
};
btnMenu.addActionListener(MENU_ACTION_LISTENER);
解决方案2的示例代码:
// package-private, only GUI-package classes should be able to use it.
// most likely I won't ever need to subclass it, so why not making it final?
final class MenuActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
// now, wherever I need to use it:
btnMenu.addActionListener(new MenuActionListener());
我对这两种解决方案都有些怀疑:
ActionListenersUtil
),其中存储了我想在静态final
字段中重用的所有操作侦听器,但我不喜欢它。。。在我看来,这是一个糟糕的设计com.myapp.gui
,侦听器的com.myapp.gui.listeners
),但当我写下这一点时,我意识到我别无选择:唯一有意义的地方是在同一个包中(因为它们必须是包私有的),即使为了订货,我想把它们都放在一个单独的包裹里。
尽管如此,我仍然有一些疑问,因为即使GUI发生变化,大多数操作侦听器也可能是可重用的;将其放在同一个包中仍然是一个好主意btnMenu.addActionListener(MENU_ACTION_LISTENER);
和btnMenu.addActionListener(new MenuActionListener());
之间有什么区别(从JVM、类加载、类编译、每个类占用的内存、垃圾收集等方面讲)
请帮帮我,我现在很困惑!:(最好的方法是创建一个
动作
,而不是一个动作监听器
,如果你必须将它连接到按钮、菜单等。动作
是按钮
的模型,这个模型是用来共享的
这还使您能够更改操作
同时附加到的所有按钮的文本、图标、启用状态和其他属性,而无需多次调用。此外,它还可以附加到菜单项等
要创建一个
操作
您不必从头开始。这是一个很好的起点。也是一个很好的读物。+1这还使您能够更改操作
同时附加到的所有按钮的文本、图标、启用状态和其他属性,而无需多次调用。此外,还可以附加到菜单项等。@Brian说得很好。我将其复制粘贴到答案中以使其更详细complete@Robin谢谢!希望我能+1两次。Action
是Swing中使用最不充分的课程之一,依我看。哦,shi-!我来晚了一点!:|经验不足会开坏玩笑……不幸的是,现在我无法改变一切ng,使用ActionListener
s是否有一种优雅的方式?
// package-private, only GUI-package classes should be able to use it.
// most likely I won't ever need to subclass it, so why not making it final?
final class MenuActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
// now, wherever I need to use it:
btnMenu.addActionListener(new MenuActionListener());