2013-08-25 52 views
0

我已經創建了一個簡單的LED,它接收來自開關/門等任意數字組件的輸入。問題是,當試圖實現PropertyChangeListener接口時,我得到一個NullPointerException。使用下面的代碼,如果我只是將其添加到JFrame窗體並嘗試運行它,我會得到此異常。我已經實施了LED,就像我爲門/開關所做的一樣,但由於某些原因,我的代碼產生了錯誤。任何幫助讚賞。addPropertyChangeListener上的NullPointerException

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


} 
+0

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

無關:請學習java命名約定並堅持。 – kleopatra

回答

2

你來體驗上addPropertyChangeListener一個NullPointerException的唯一方法是,如果的PropertyChangeSupport爲null。但它顯然不應該爲空創建的對象通常,但我猜這是你的問題,你的對象沒有正常創建。

由於你的對象實現了Serializable接口,我猜你的問題是由於你反序列化這種類型的對象,而不是爲反序列化的對象創建瞬態PropertyChangeSupport對象。由於它是暫時的,因此在反序列化時不會默認創建。如果是這樣,你必須改變你的序列化讀取在對象中的方式。你會想要做Custom Serialization,特別是將不得不覆蓋readObject(...)方法。另請查閱Effective Java chapter on Serialization


編輯
順便說一句,你的PropertyChangeSupport對象應該是一個SwingPropertyChangeSupport對象,因爲你是一個Swing GUI


編輯2
但你的類繼承JPanel,這是自從JPanel 已經有內部PropertyChangeSupport完成addPropertyCha ngeListener和removePropertyChangeListener方法,所以只需使用JPanel的內在支持。


編輯3
哦,是的,有點怪的通知我,你paintComponent(...)方法覆蓋是有缺陷的,你應該總是調用父類的在覆蓋方法方法,這樣的背景,可以得出和家務做。即

@Override 
public void paintComponent(java.awt.Graphics g) { 
    super.paintComponent(g); // **** add this 
    g.drawImage(image, 0, 0, null); 
} 

請注意,這不會幫助你與你的NPE,但會幫助其他錯誤。

+1

(咳嗽)'super.paintComponent'(咳嗽) – MadProgrammer

+0

@MadProgrammer:你需要咳嗽抑制劑(謝謝btw)。 –

+0

該問題實際上已通過刪除Nimbus外觀和感覺自動編碼得到解決。一旦我刪除這個nullpointexecptions停止。我不懂爲什麼。我按照我們的說法實現了Serializable接口:所有的bean都必須持久化。要堅持下去,您的bean必須通過實現java.io.Serializable接口或java.io.Externalizable接口來支持序列化。我嚴重誤解了序列化。如果所有的bean都必須堅持下去,這並不意味着我創建的每個bean(如上面的LED)都必須實現Serializable接口嗎? – smuzoen

相關問題