当前位置: 首页 > 知识库问答 >
问题:

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

慕容宏毅
2023-03-14

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

            }
        });
    }
}

共有3个答案

钮勇
2023-03-14

视情况而定。如果您想跨多个组件重用ActionListener,选项一更好。如果ActionListener只会与一个按钮相关联,选项二很好。

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

经俊茂
2023-03-14

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

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

  • Foo的用户不应该知道它实现了ActionListener
  • 您不能在同一个类中实现两个不同的侦听器。
郎睿
2023-03-14

有些人(jeanette/kleopatra)说几乎不要使用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: 或添加匿名ActionListener类的对象: 问题答案: 有些人(jeanette / kleopatra)表示几乎 从不 使用ActionListener,而是使用诸如AbstractAction之类的Action。让GUI类实现侦听器几乎总是一个糟糕的理想选择,因为这

  • 问题内容: 我最近正在做一个编程任务,要求我们用代码实现由UML图指定的程序。在某一时刻,该图指定我必须创建一个匿名JButton,该JButton显示一个计数(从1开始)并在每次单击时递减。JButton及其ActionListener都必须是匿名的。 我想出了以下解决方案: 这将添加一个匿名JButton,然后添加另一个(内部)匿名ActionListener来处理事件并根据需要更新按钮的文本

  • 在以下片段中: 有没有办法从内部匿名类引用匿名类的外部实例? 第二个错误是在解决方案上,我在这里找到了一个匿名内部类的外部类的关键字。这些问题似乎共享一些概念和问题空间,但性质不同。

  • 我正在为餐馆提供的菜肴做模型。我可以做一个像这样的菜类: 关于内存使用,最好为每个盘创建盘的实例,<代码>盘。新(“咖喱鸡”,…) 为了澄清起见,ChickenCurry类将只包含一个构造函数,其中它设置了适当的字段,如下所示: 哪个使用更多的资源,还是?差异可以忽略不计吗?我计划拥有数千个这样的对象,因此即使是10 KB的差异也值得考虑。 我正在使用JRuby,所以在回答时请考虑JVM,但也欢迎

  • 问题内容: 匿名类如何扩展超类或实现接口? 问题答案: 匿名类 必须 像其他Java类一样扩展或实现某些东西,即使它只是just 。 例如: 这里是实现的匿名类的对象。 匿名类可以使用相同的语法扩展另一个类: 您无法实现的是实现多个接口。您需要一个命名类来做到这一点。但是,匿名内部类和命名类都不能扩展多个类。

  • 当我创建一个抽象类的对象时,我必须像接口一样这样做。 这是否意味着的对象是匿名的内部类对象?