提问者:小点点

ActionListener最佳实践[关闭]


想改进这个问题吗?更新问题,以便通过编辑这篇文章用事实和引用来回答。


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

我已经阅读了Java的如何编写动作监听器教程,并且我已经阅读了这个问题,但是我仍然有一些疑问:我想知道当我必须多次执行相同的动作时,哪种解决方案是最好的。

我想重用相同的ActionListener,但我不确定如何以最佳方式实现这一点(从代码易读性、代码可操作性、性能和代码风格的角度来说)。

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

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

这样我就不能重用任何obv,因为它是一个匿名的内部类…

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

  1. 将匿名内部类的引用存储在字段中(很可能是静态最终);
  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());

我对这两种解决方案都有一些疑问:

>

  • 在哪里存储对匿名操作监听器的引用?我可以有一种实用程序类(例如ActionListenersUtil),其中存储我想在静态最终字段中重用的所有操作监听器,但我不喜欢它…在我看来设计很差。

    它更有意义,可能最好遵循命令模式…我最初对包有些怀疑…我想把所有侦听器放在一个单独的包中(例如com. myapp.gui用于gui元素,com.myapp.gui.listeners用于侦听器。但是当我写下这个时,我意识到我别无选择:唯一有意义的地方是在同一个包中(因为它们必须是包私有的),即使为了顺序我想把它们都放在一个单独的包中。我仍然有一些疑问,因为大多数动作侦听器可能是可重用的,即使在GUI更改的情况下;在同一个包中使用它仍然是个好主意?

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

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


  • 共1个答案

    匿名用户

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

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

    要创建Action,您不必从头开始。AbstractAction是一个很好的起点。SwingAction教程也是一本不错的读物。