Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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还是使用匿名ActionListener类的对象_Java_Swing_Actionlistener - Fatal编程技术网

Java 您的类应该实现ActionListener还是使用匿名ActionListener类的对象

Java 您的类应该实现ActionListener还是使用匿名ActionListener类的对象,java,swing,actionlistener,Java,Swing,Actionlistener,实现java.awt.event.ActionListener接口的最佳方法是什么 让您的类实现ActionListener并将其添加为ActionListener: class Foo implements ActionListener{ public Foo() { JButton button = new JButton(); button.addActionListener(this); } public void action

实现java.awt.event.ActionListener接口的最佳方法是什么

让您的类实现ActionListener并将其添加为ActionListener:

class Foo implements ActionListener{

    public Foo() {
        JButton button = new JButton();
        button.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {

    }
}
或添加匿名ActionListener类的对象:

class Foo{

    public Foo() {
        JButton button = new JButton();
        button.addActionListener(new ActionListener() {     
            public void actionPerformed(ActionEvent e) {

            }
        });
    }
}
有些人(珍妮特/克丽奥帕特拉)说几乎从不使用ActionListener,而是使用AbstractAction之类的动作。让您的GUI类实现您的侦听器几乎总是一个不好的理想,尽管这会破坏您的代码,使您的代码更难维护和扩展,因此我强烈建议您不要这样做

例如,一个用于此的内部类:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;

class Foo {

   public Foo() {
       JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A));
   }

   private class ButtonAction extends AbstractAction {
      public ButtonAction(String name, Integer mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         System.out.println("button pressed");
      }
   }

}

视情况而定。如果您想跨多个组件重用
ActionListener
,那么选项一更好。如果
ActionListener
仅与一个按钮关联,则选项二可以

通常,如果您预期项目会有所增长,那么您会创建一个单独的类(或内部类)。没有必要使用
Foo
来实现
ActionListener

第二个选项(匿名类)当然更好,另一个选项是在
Foo
中有一个嵌套类

我不同意第一种选择,原因有二:

  • Foo
    的用户不必知道它实现了
    ActionListener
  • 不能在同一个类中实现两个不同的侦听器

+1表示
抽象操作
和.Nice,但它似乎更复杂(在代码维护方面),更难阅读。还是我错了?随着你对它越来越熟悉,它会变得容易阅读。当我试图维护一个分离良好的MVC模式,并让我的控件将操作注入到我的JButtons中时,我使用了它。别忘了,它更容易测试。当action类与UIRelated示例和comments中的建设性评论无关时,您可以简单地测试它。让gui类实现ActionListener仅适用于玩具程序。既然他问的是“最佳实践”,那么这在任何情况下都没有用。我会出于第一个原因对这个答案投赞成票,但第二个原因是错误的。您可以检查
ActionEvent
的源代码,并决定应该采用的代码路径。这是否是一个优雅的解决方案是另一个讨论,但肯定是possible@Robin:你说得对,但那不是我的观点。我的意思是不能在同一个类中实现两次
ActionListener