【问题标题】:ActionListener best practices [closed]ActionListener 最佳实践 [关闭]
【发布时间】:2014-06-01 04:37:57
【问题描述】:


抱歉标题,可能太笼统了。

我已经阅读了 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接口的新类。

方案一的示例代码:

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...我最初对这些包有些怀疑...我希望将所有听众放在一个单独的包中(例如com.myapp.gui for gui 元素和com.myapp.gui.listeners 供听众使用。但是当我写下来时,我意识到我别无选择:唯一有意义的地方是在同一个包中(因为它们必须是包私有的),即使为了订单我想把它们都放在一个单独的包里。 不过我仍然有些怀疑,因为即使 GUI 发生变化,大多数动作侦听器也可能是可重用的;将它放在同一个包中仍然是个好主意吗?

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

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

【问题讨论】:

    标签: java swing package actionlistener


    【解决方案1】:

    最好的方法是创建一个Action 而不是ActionListener,如果您必须将它附加到按钮、菜单等...。 ActionJButton 的模型,模型是用来共享的

    这还使您能够同时更改 Action 所附加到的所有按钮的文本、图标、启用状态和其他属性,而无需多次调用。此外,它还可以附加到菜单项等。

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

    【讨论】:

    • +1 这还使您能够同时更改 Action 所附加的所有按钮的文本、图标、启用状态和其他属性,而无需多次调用。此外,它还可以附加到菜单项等。
    • @Brian 非常好的评论。我将其复制粘贴在答案中以使其更完整
    • @Robin 谢谢!希望我能 +1 两次。 Action 是 IMO 的 Swing 中使用最少的类之一。
    • 天啊!我有点晚了! :|经验不足会开玩笑......不幸的是,现在我无法改变一切,有没有一种优雅的方式可以使用ActionListeners?
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 2013-10-02
    • 2010-10-06
    • 2011-10-28
    • 2010-09-10
    • 2011-10-11
    • 1970-01-01
    • 2014-04-26
    相关资源
    最近更新 更多