我创建了一个简单的LED,它接收来自许多数字组件(例如开关/门)中任何一个的输入。问题是,当尝试实现PropertyChangeListener接口时,我得到了NullPointerException。使用下面的代码,如果我只是将其添加到JFrame表单并尝试运行它,则会出现此异常。我已经实现了与门/开关相同的LED,但是由于某种原因,我的代码生成了错误。任何帮助表示赞赏。
package Digital;
import java.awt.Image;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
public class LED extends javax.swing.JPanel implements PropertyChangeListener {
private Image led_on;
private Image led_off;
private Image image;
private Terminal input;
private transient PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);
public LED() {
java.net.URL url_on = getClass().getResource("images/LED_on.gif");
led_on = new javax.swing.ImageIcon(url_on).getImage();
this.setSize(led_on.getWidth(null), led_on.getHeight(null));
java.net.URL url_off = getClass().getResource("images/LED_off.gif");
led_off = new javax.swing.ImageIcon(url_off).getImage();
this.setSize(led_off.getWidth(null), led_off.getHeight(null));
this.image = led_off;
}
@Override
public void paintComponent(java.awt.Graphics g) {
g.drawImage(image, 0, 0, null);
}
public static final String PROP_INPUT = "input";
public Terminal getInput() {
return input;
}
public void setInput(Terminal input) {
if (input != null) {
input.addPropertyChangeListener(this);
this.addPropertyChangeListener(this);
}
Terminal oldInput = this.input;
this.input = input;
propertyChangeSupport.firePropertyChange(PROP_INPUT, oldInput, input);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertyChangeSupport.removePropertyChangeListener(listener);
}
public boolean Recalculate(Terminal input) {
if (input!=null) {
return input.getValue();
} else {
return false;
}
}
public void ledChange(boolean ledValue) {
if (ledValue) {
image = led_on;
} else {
image = led_off;
}
repaint();
}
public void propertyChange(PropertyChangeEvent pce) {
boolean terminalValue = Recalculate(input);
ledChange(terminalValue);
}
}
最佳答案
遇到addPropertyChangeListener上的NullPointerException的唯一方法是PropertyChangeSupport为null。但这显然在正常创建的对象中不应该为null,但是我猜这是您的问题,您的对象不是正常创建的。
由于您的对象实现了Serializable接口,因此我猜您的问题是由于您对该类型的对象进行了反序列化,而不是为该反序列化的对象创建了临时PropertyChangeSupport对象。由于它是瞬态的,因此在反序列化时不会默认创建它。如果是这样,则必须更改对象中序列化读取的方式。您将要执行Custom Serialization,尤其是必须重写readObject(...)
方法。另外,请检查Effective Java chapter on Serialization。
编辑
顺便说一句,您的PropertyChangeSupport对象应该是SwingPropertyChangeSupport对象,因为您的对象是Swing GUI
编辑2
但是,由于您的类扩展了JPanel,因此这一切都没有意义,因为JPanel已经具有固有的PropertyChangeSupport以及addPropertyChangeListener和removePropertyChangeListener方法,因此只需使用JPanel的固有支持即可。
编辑3
哦,是的,有些小鸟通知我您的paintComponent(...)
方法重写不足,因为您几乎应该始终在override方法中调用super的方法,以便可以绘制背景并完成内务处理。即
@Override
public void paintComponent(java.awt.Graphics g) {
super.paintComponent(g); // **** add this
g.drawImage(image, 0, 0, null);
}
请注意,这不会帮助您使用NPE,但会帮助您解决其他错误。
关于java - NullPointerException on addPropertyChangeListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18425483/