重写 JLabel 中的 setText() 方法

Override setText() method in JLabel

我在 Java 中实现了以下代码。

public class FadeLabel extends javax.swing.JLabel {

    private Timer onTimer;

    public FadeLabel() {
        init();
    }

    private void init(){
        setHorizontalAlignment(CENTER);
        setVerticalAlignment(CENTER);
        onTimer = new Timer(100, (ActionEvent e) -> {
            // animation code
        });
    }

    @Override
    public void setText(String text) {
        onTimer.start();
        super.setText(text);
    }
}

当我创建这个 class 的对象时,它在 setText() 方法中给出了一个 NullPointerException,行 onTimer.start().

我想知道为什么会出现这个异常..?

ps: 我知道什么是NullPointerException。我想知道这里是怎么生成的..

这就是我实例化的方式。

notificationLabel = new FadeLabel();

您定义 属性 onTimer。你有一个方法初始化。您必须调用它来实例化定时器 属性 onTimer。

正在查看 source code JLabel

public JLabel() {
    this("", null, LEADING);
}

public JLabel(String text, Icon icon, int horizontalAlignment) {
    setText(text);
    setIcon(icon);
    setHorizontalAlignment(horizontalAlignment);
    updateUI();
    setAlignmentX(LEFT_ALIGNMENT);
}

因此我们可以看到无参数构造函数调用另一个构造函数,然后调用另一个构造函数setText。但是那时你的 init 方法还没有 运行,所以 onTimer 仍然是 NULL