代码之家  ›  专栏  ›  技术社区  ›  Ramesh-X Wen-Shan Wendy Chow

重写JLabel中的setText()方法

  •  1
  • Ramesh-X Wen-Shan Wendy Chow  · 技术社区  · 7 年前

    我用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);
        }
    }
    

    NullPointerException setText() 方法,线路 onTimer.start() .

    我想知道为什么会发生这种异常。。?

    ps: 空指针异常 是我想知道它是如何在这里生成的。。

    notificationLabel = new FadeLabel();
    
    2 回复  |  直到 7 年前
        1
  •  8
  •   Buddy    7 年前

    查看 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

        2
  •  -3
  •   Buddy    7 年前

    您可以在Timer上定义属性。你有一个init方法。您必须调用它来实例化timer上的计时器属性。