ActionListener最佳实践

时间:2012-09-17 16:22:10

标签: java swing package actionlistener

左边的标题很抱歉,可能太通用了。

我已经阅读了Java的How to Write an Action Listener教程,我已经阅读了this question,但我仍有一些疑问:当我不得不多次执行相同的操作时,我想知道哪种解决方案最好。

我想重复使用相同的ActionListener,但我不确定如何以最佳方式实现这一点(在代码可读性,代码可持续性,性能和代码风格方面)。< / p>

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

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

这样我就无法重用任何obv,因为它是一个匿名的内部类......

现在,我可以想到以下解决方案:

  1. 在字段中存储匿名内部类的引用(很可能是static final);
  2. 编写一个实现ActionListener接口的新类。
  3. 解决方案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 ...我最初对包有一些疑问......我想让所有听众都在一个单独的包中(例如{{ 1}}用于gui元素而com.myapp.gui用于监听器。但是当我写下来时,我意识到我别无选择:唯一有意义的地方是在同一个包中(因为它们必须是package-private),即使为了顺序,我也想将它们全部放在一个单独的包中。 我仍然有一些疑问,因为即使在GUI更改的情况下,大多数动作侦听器也可以重复使用;将它放在同一个包装中仍然是一个好主意吗?

    3. 另一个问题:调用com.myapp.gui.listenersbtnMenu.addActionListener(MENU_ACTION_LISTENER);之间的区别是什么(根据JVM,类加载,类编译,每个类占用的内存,垃圾回收等)?

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

1 个答案:

答案 0 :(得分:14)

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

这使您还可以在没有多次调用的情况下同时更改Action所连接的所有按钮的文本,图标,启用状态和其他属性。此外,它可以附加到菜单项,如井。

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