抽象类中实现的动作侦听器不会被扩展它的类所继承

问题描述 投票:0回答:1

大家节日快乐,

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

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上的错误,那就很简单了]

java swing actionlistener
1个回答
1
投票

仅给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图形系统自动调用。

0
投票

看起来您只想演示实现ActionListener的类的多态行为。为此,您不需要扩展JButton。您只需要实现ActionListener。以下示例代码将演示您想要做什么:

© www.soinside.com 2019 - 2024. All rights reserved.