实现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
,选项一更好。如果ActionListener
只会与一个按钮相关联,选项二很好。
通常,如果您预计项目会有一些增长,您会创建一个单独的类(或内部类)。Foo
无需实现ActionListener
。
第二个选项(匿名类)当然更好,另一个选项是在Foo
中有一个嵌套类。
出于两个原因,我不会选择第一个选项:
Foo
的用户不应该知道它实现了ActionListener
。有些人(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 。 例如: 这里是实现的匿名类的对象。 匿名类可以使用相同的语法扩展另一个类: 您无法实现的是实现多个接口。您需要一个命名类来做到这一点。但是,匿名内部类和命名类都不能扩展多个类。
当我创建一个抽象类的对象时,我必须像接口一样这样做。 这是否意味着的对象是匿名的内部类对象?