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

标签 java swing actionlistener

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

让您的类实现 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 类实现你的监听器几乎总是一个糟糕的理想,因为这会破坏 Single Responsibility Principle并使您的代码更难维护和扩展,因此我强烈建议您不要这样做。

例如,一个内部类:

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");
      }
   }

}

关于java - 您的类应该实现 ActionListener 还是使用匿名 ActionListener 类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11438048/

相关文章:

java - 有没有更好的方法可以从 InputStream 中获取 Avro 记录列表?

java - 我如何告诉 Graphene 加载我的@Page?

java - 如何在 JPanel 中启用溢出滚动条?

java - 同一类型的 Swing 事件是否有保证优先级?

java - 如何根据先前选择的 JButton 更改 JPanel 的内容?

java - 在java swing中处理事件

java - 确定BST的高效算法

java - 循环内字符串串联并引发不允许的异常 : java. lang.Exception

java - 如何在 Java 中对字符串进行 HTML 化

java - 用于 Swing 的多列组合框