祝大家节日快乐
这是我试图理解的情况的一个用例。
public abstract class Animal extends JButton implements ActionListener {
private boolean actionFlag = false;
//some constructor
//some functions
@Override
public void actionPerformed(ActionEvent actionEvent) {
this.actionFlag = true;
System.out.println(this.actionFlag);
}
}
public class Tiger extends Animal {}
public class Bear extends Animal {}
例如 Tiger
和Bear
对象被创建,它们是 BTN 的原因,抽象方法扩展了 JButton
类,这些按钮按下时各自的 ActionPerformed()
函数将被调用,因为我没有覆盖 actionPerformed
分别对每个类进行 func,它们将继承 actionPerformed()
来自其父类 Animal
,我相信到目前为止我是正确的,如果不对请随时纠正我。
现在,由于所有这些观察结果都是正确的,例如,当我单击“熊”按钮时,我应该看到输出中的消息等于“true”。
这就是问题所在,我的控制台上没有出现任何内容,看起来像 actionListener
基类的值根本没有被触发。
(GUI上的按钮是setEnabled(true)
所以交互不是问题)
造成这种情况的可能原因是什么?我在这里缺少什么?
paintComponent()
也会发生同样的情况函数,但我相信如果我理解 actionListener
上的错误那么就很简单了)
最佳答案
仅向 JButton 扩展类提供 ActionListener 不会将该监听器添加到创建的按钮。为此,您必须在类的构造函数中使用 addActionListener(this);
实际添加监听器。
public abstract class Animal extends JButton implements ActionListener {
private boolean actionFlag = false;
public Animal() {
addActionListener(this);
}
//some constructor
//some functions
@Override
public void actionPerformed(ActionEvent actionEvent) {
this.actionFlag = true;
System.out.println(this.actionFlag);
}
}
话虽如此,我永远不会有这样的 Swing 代码。相反,我会
- 如果可能的话,通过组合进行扩展,除非我绝对需要重写现有的 JButton 方法(并且需要证明这一点)
- 将 View 类与监听器分开,即使这意味着使用匿名内部类。很少建议让 View 类实现监听器接口(interface),因为这打破了“单一职责原则”并增加了类的复杂性和用途,但没有任何好处
关于:
Same thing happens with the
paintComponent()
这里可能会发生不同的情况,因为您不需要向组件“添加”paintComponent,而是如果它是正确的方法覆盖,它会由 Swing 图形系统自动调用.
关于java - 在抽象类中实现的 Action 监听器不会被扩展它的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471197/