祝大家节日快乐

这是我要了解的情况的用例。

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函数都将分别从其父类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方法(并且这需要证明是合理的)
将我的视图类与侦听器分开,即使这意味着要使用匿名内部类。最好不要让视图类实现侦听器接口,因为这违反了“单一职责原则”,并增加了类的复杂性和目的,无济于事




关于:


  paintComponent()也会发生相同的情况


此处可能会发生一些不同的事情,因为您不需要向组件“添加” paintComponent,而是如果它是适当的方法替代,则Swing图形系统会自动调用它。

关于java - 在Abstract Class中实现的 Action 监听器不会被扩展它的类继承,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59471197/

10-14 12:47