简体   繁体   English

ActionEvent - 按下按钮更改JLabel

[英]ActionEvent - Changing JLabel on button press

I'm still new to Java and I'm having trouble with changing the image in a JLabel when a button has been clicked. 我还是Java的新手,当点击一个按钮时,我在更换JLabel中的图像时遇到了麻烦。 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" “线程中的异常”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)

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. 那么你的类中只有一个全局变量,你不会得到NullPointerException。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM