重写 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
。
我在 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
。