17

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

            }
        });
    }
}
4

3 回答 3

30

有些人(jeanette/kleopatra)说几乎从不使用 ActionListener,而是使用 Actions,例如 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");
      }
   }

}
于 2012-07-11T17:24:56.667 回答
8

第二种选择(匿名类)当然更好,另一种选择是在Foo.

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

  • 的用户Foo不必知道它实现了ActionListener.
  • 您不能在同一个类中实现两个不同的侦听器。
于 2012-07-11T17:28:31.103 回答
4

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

通常,如果您预计项目会有所增长,您将创建一个单独的类(或内部类)。没有必要Foo实施ActionListener.

于 2012-07-11T17:27:12.827 回答