java - 在抽象类中实现的 Action 监听器不会被扩展它的类继承

标签 java swing actionlistener

祝大家节日快乐

这是我试图理解的情况的一个用例。

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 {}

例如 TigerBear对象被创建,它们是 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/

相关文章:

java - Java Swing 中的 PNG 渲染错误(颜色深度低)

java - 如何在 JRadioButtons 中使用 ActionListener

java - Java 中高效的 JSON 搜索

java:如何从数据库获取值到jTable中

java - JTable 日期过滤器未按应有的方式工作

java - setEnabled(true) 当 radioButton.isSelected()

java - 空指针异常和操作监听器

java - 如何将 JButtons 从列表连接到 actionListener

java - 将时间值的整数从 100 限制到 60 的巧妙方法? (例如一分钟 60 秒)

java - 捕获两个异常,一个是另一个的父类(super class)