2013-04-10 3 views
0

Я по-прежнему новичок в Java и у меня возникают проблемы с изменением изображения в JLabel при нажатии кнопки. У меня нет ошибок компилятора, но я получаю ошибку времени выполнения.ActionEvent - Изменение кнопки JLabel на кнопке

Line 107: l1.setIcon(icon); 

"Исключение в потоке "АВТ-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). –

+0

'Clock clock1 = new Clock();' Чтобы лучше помочь, опубликуйте [SSCCE] (http://sscce.org/). –

+0

Вероятно, что 'clock1.getPicture()' возвращает значение null. – BlackBox

ответ

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

Смежные вопросы