抱歉标题,可能太通用了.
我已经阅读了Java 如何编写动作监听器教程,我已经阅读了这个问题,但我仍有一些疑问:当我必须多次执行相同的动作时,我想知道哪种解决方案是最好的.
我想重用相同的ActionListener,但我不确定如何以最好的方式实现这一点(在代码可读性,代码可持续性,性能和代码风格方面).
首先是"标准"代码(如果我不打算重用动作监听器,我将使用它):
btnMenu.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
}
);
Run Code Online (Sandbox Code Playgroud)
这样我就无法重用任何obv,因为它是一个匿名的内部类......
现在,我可以想到以下解决方案:
static final);ActionListener接口的新类.解决方案1的示例代码:
public static final MENU_ACTION_LISTENER = new ActionListener() {
public void actionPerformed(ActionEvent e) {
Navigator.showMenu();
}
};
btnMenu.addActionListener(MENU_ACTION_LISTENER);
Run Code Online (Sandbox Code Playgroud)
解决方案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 …Run Code Online (Sandbox Code Playgroud) 我怎样才能给出附在他们身上JMenuItem的名字ActionListener?
我有一个由单个处理的菜单系统,ActionListener这些菜单中的一些项目重复名称.这不是用户端的问题,因为它显然是做什么的; 事实上,如果他们有不同的名字会更加混乱.但是,在我的最后,我想要唯一地标记每个项目.
创建我的项目的部分如下所示:
String label = getLabel(forThisItem);
JMenuItem item = new JMenuItem(label);
item.setName(parentMenu.getName() + "_" + label);
item.addActionListener(actionListener);
parentmenu.add(item);
Run Code Online (Sandbox Code Playgroud)
使用getName()在事后(在此方法的范围之外)询问项目,给出我给它的名称,因为它应该,但输出
public void actionPerformed(ActionEvent ae) {
String actionPerformed = ae.getActionCommand();
System.out.println("actionPerformed: " + actionPerformed);
}
Run Code Online (Sandbox Code Playgroud)
是用户看到的,可能是重复的名称,由label我指定的名称,而不是我给它的唯一名称.
如何将正确的信息提供给ActionListener?