2013-04-10 64 views
0

我還是Java新手,在單擊按鈕時更改JLabel中的圖像時遇到問題。我沒有收到任何編譯器錯誤,但確實遇到了運行時錯誤。ActionEvent - 在按鈕上更改JLabel按

Line 107: l1.setIcon(icon); 

「異常線程 」AWT-EventQueue的-0「 顯示java.lang.NullPointerException」

public class HomeController1 extends JPanel implements ActionListener 
{ 
private int choice; 
private JButton add; 
private JLabel l1; 

public HomeController1() { 

    // Create panels and set layouts 
    JPanel p1 = new JPanel(new GridLayout(1,4)); 
    JPanel p2 = new JPanel (new GridLayout(3,3)); 
    JPanel p3 = new JPanel(new BorderLayout()); 

    // Create buttons 
    add = new JButton("ADD APPLIANCE"); 

    //Add ActionListeners 
    add.addActionListener(this); 

    // Add buttons to panel 
    p1.add(add); 

    // Default ImageIcon 
    ImageIcon blank = new ImageIcon("blank.jpg"); 

    // Create Jlabels to hold blank image 
    JLabel l1 = new JLabel(blank); 

    // Add JLabels to Panel 
    p2.add(l1); 

    //Add contents to Frame 
    p3.add(p1,BorderLayout.SOUTH); 
    p3.add(p2,BorderLayout.CENTER); 
    add(p3); 

}  

    public void actionPerformed(ActionEvent e) 
    { 
     if (e.getSource() == add) 
     { 
      choice = 0; 

      if (choice == 0) 
      { 
       Clock clock1 = new Clock(); 
       ImageIcon icon = clock1.getPicture(); 
       l1.setIcon(icon); 
      } 
     } 
    } 

}

完整的錯誤信息:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at HomeController.actionPerformed(HomeController.java:107) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6505) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3312) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:688) 
at java.awt.EventQueue$3.run(EventQueue.java:686) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:702) 
at java.awt.EventQueue$4.run(EventQueue.java:700) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+0

複製/粘貼整個堆棧跟蹤(包括行號)作爲[編輯問題](http://stackoverflow.com/posts/15926319/edit)。 – 2013-04-10 12:51:58

+0

'時鐘clock1 =新時鐘();'爲了更好地提供幫助,請發佈[SSCCE](http://sscce.org/)。 – 2013-04-10 12:53:38

+0

可能'clock1.getPicture()'返回null。 – BlackBox 2013-04-10 12:53:44

回答

2

你的問題就來了從你已經在家庭控制器中聲明瞭一個全局變量的事實:

private JLabel l1; 

和另外一個,地方,在你的構造:

// Create Jlabels to hold blank image 
JLabel l1 = new JLabel(blank); 

在構造函數中,您所定義的名稱相同的變量在你的類,但它是一個不同的變量。構造函數中的一個隱藏了你的類中的一個。 因此,最終,只有您的構造函數變量被初始化。如果您改變了這樣的代碼在你的構造,

// Create Jlabels to hold blank image 
l1 = new JLabel(blank); 

然後你只需要在你的類中的一個全局變量,你不會得到一個NullPointerException。

+0

謝謝,它總是讓你感到失望的簡單錯誤。 – user1861156 2013-04-10 13:14:31