繁体   English   中英

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

[英]Should your class implement ActionListener or use an object of an anonymous ActionListener class

实现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) {

            }
        });
    }
}

一些人(jeanette / kleopatra)说几乎从不使用ActionListener,而是使用诸如AbstractAction之类的Action。 让你的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");
      }
   }

}

第二个选项(匿名类)肯定更好,另一个选择是在Foo有一个嵌套类。

我不会选择第一个选项有两个原因:

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

这取决于。 如果要跨多个组件重用ActionListener ,则选项一更好。 如果ActionListener只与一个按钮相关联,则选项二很好。

通常,如果您预计项目会有一些增长,您可以创建一个单独的类(或内部类)。 Foo不需要实现ActionListener

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM