Reputation: 169
I'm still new to Java and I'm having trouble with changing the image in a JLabel when a button has been clicked. I don't get any compiler errors but I do get a run time error.
Line 107: l1.setIcon(icon);
"Exception in thread "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);
}
}
}
}
Full Error Message:
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)
Upvotes: 0
Views: 1496
Reputation: 56
your problem comes from the fact that you have declared a global variable in home controller:
private JLabel l1;
and another one, local, in your constructor:
// Create Jlabels to hold blank image
JLabel l1 = new JLabel(blank);
In your constructor, you defined a variable with the same name as in your class, but it's a different variable. The one in your constructor hides the one in your class. So, in the end, only your constructor variable is initialized. If you change your code like this in your constructor,
// Create Jlabels to hold blank image
l1 = new JLabel(blank);
Then you'll only have one global variable in your class and you won't get a NullPointerException.
Upvotes: 2