Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ActionListener最佳实践_Java_Swing_Package_Actionlistener - Fatal编程技术网

Java ActionListener最佳实践

Java ActionListener最佳实践,java,swing,package,actionlistener,Java,Swing,Package,Actionlistener,很抱歉标题太笼统了 我已经阅读了Java教程,也已经阅读了,但我仍然有一些疑问:我想知道当我必须多次执行相同的操作时,哪种解决方案是最好的 我希望重用相同的ActionListener,但我不确定如何以最佳方式实现这一点(就代码可读性、代码可维护性、性能和代码风格而言) 首先是“标准”代码(如果我不打算重用动作侦听器,我会使用该代码): 这样我就不能重用任何obv,因为它是一个匿名的内部类 现在,我可以想到以下解决方案: 在字段中存储匿名内部类的引用(很可能是静态final) 编写一个实现Act


很抱歉标题太笼统了

我已经阅读了Java教程,也已经阅读了,但我仍然有一些疑问:我想知道当我必须多次执行相同的操作时,哪种解决方案是最好的

我希望重用相同的
ActionListener
,但我不确定如何以最佳方式实现这一点(就代码可读性、代码可维护性、性能和代码风格而言)

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

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

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

  • 在字段中存储匿名内部类的引用(很可能是
    静态final
  • 编写一个实现
    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
    ),其中存储了我想在
    静态final
    字段中重用的所有操作侦听器,但我不喜欢它。。。在我看来,这是一个糟糕的设计

  • 这更有意义,可能最好遵循。。。起初我对包裹有些怀疑。。。我希望将所有侦听器放在一个单独的包中(例如,gui元素的
    com.myapp.gui
    ,侦听器的
    com.myapp.gui.listeners
    ),但当我写下这一点时,我意识到我别无选择:唯一有意义的地方是在同一个包中(因为它们必须是包私有的),即使为了订货,我想把它们都放在一个单独的包裹里。 尽管如此,我仍然有一些疑问,因为即使GUI发生变化,大多数操作侦听器也可能是可重用的;将其放在同一个包中仍然是一个好主意

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


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

    最好的方法是创建一个
    动作
    ,而不是一个
    动作监听器
    ,如果你必须将它连接到按钮、菜单等。
    动作
    按钮
    的模型,这个模型是用来共享的

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


    要创建一个
    操作
    您不必从头开始。这是一个很好的起点。也是一个很好的读物。

    +1这还使您能够更改
    操作
    同时附加到的所有按钮的文本、图标、启用状态和其他属性,而无需多次调用。此外,还可以附加到菜单项等。@Brian说得很好。我将其复制粘贴到答案中以使其更详细complete@Robin谢谢!希望我能+1两次。
    Action
    是Swing中使用最不充分的课程之一,依我看。哦,shi-!我来晚了一点!:|经验不足会开坏玩笑……不幸的是,现在我无法改变一切ng,使用
    ActionListener
    s是否有一种优雅的方式?
    // 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());