2012-09-17 177 views
8


对不起,标题可能太泛泛。ActionListener最佳做法

我已经在Java读取How to Write an Action Listener教程,我已经读过this question,但我也有疑问:我想知道哪个解决方案是最好的,当我不得不执行相同的操作多个时间。

我想重复使用相同的ActionListener,但我不确定如何以最佳方式实现此目的(从代码可读性,代码可保留性,性能和代码样式来讲)。

首先,“标准”代码(如果我不打算重用的动作监听器,我会用):

btnMenu.addActionListener(
    new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Navigator.showMenu(); 
     } 
    } 
); 

这样我不能重用什么OBV,因为它是一个匿名的内部类...

现在,我可以认为以下解决方案:

  1. 商店匿名内部类的一个字段(即最有可能是static final)的参考;
  2. 编写一个实现ActionListener接口的新类。

用于解决方案1实施例的代码:

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()); 

我有两种解决方案有些疑惑:

  1. 在哪里存储引用匿名操作监听器?我可以有一个工具类(例如ActionListenersUtil),其中存储我想要在static final字段中重用的所有动作侦听器,但我不喜欢它......在我看来,糟糕的设计。

  2. 它更有意义,可能是最好遵循Command Pattern ......我最初对包的一些疑问......我想有一个单独的包例如,对于GUI元素com.myapp.guicom.myapp.gui.listeners所有听众(听众,但是当我写下这些时,我意识到我没有选择:唯一有意义的地方是在同一个包中(因为他们必须是包私有的),即使为了我的命令,但我仍然有一些疑问,因为即使在GUI改变的情况下,大多数动作监听器也可以重用;将它放在同一个包中仍然是个不错的主意?

另一个问题:调用btnMenu.addActionListener(MENU_ACTION_LISTENER);btnMenu.addActionListener(new MenuActionListener());(从JVM的角度讲,类加载,类编译,每个类占用的内存,垃圾回收等等)之间有什么区别?

请帮忙,我现在很困惑! :(

回答

14

最好的方法是创建Action而不是ActionListener如果您必须将其附加到按钮,菜单...。一个ActionJButton的模型,该模型是为了共享

这也为您提供了更改的文本,图标的功能,启用的状态,并且该Action连接到所有按钮的其他属性同时没有多次通话。另外,它可以附加到菜单项目等。

要创建Action,您不必从头开始。 AbstractAction是一个很好的起点。 Swing Action tutorial也是一个很好的阅读。

+3

+1这也使您能够在没有多次调用的情况下同时更改“动作”所连接的所有按钮的文本,图标,启用状态和其他属性。另外,它可以附加到菜单项目等。 – Brian

+1

+1000如果我可以...... ;-) –

+0

@布莱恩非常好的评论。我复制粘贴它的答案,使其更加完整 – Robin