【问题标题】:Java - Filling an array of JLabels with ImageIcons via loop(NullPointerException)Java - 通过循环用 ImageIcons 填充 JLabels 数组(NullPointerException)
【发布时间】:2015-03-23 20:44:52
【问题描述】:

基本目标是让 JPanel 以 3x3 模式填充 9 个白色方块;方块是 150x150 空白的白色 .jpg 文件。一定是这样,因为以后,程序必须将空白方块更改为一组简单图像中的一个,并且必须能够随时更改任何方块。 简单地说,问题是我得到了 NullPointerException。我不得不假设这与将数组初始化为空有关,但如果我不这样做,NetBeans(是的,NetBeans ...)似乎对我很生气。如果我尝试声明数组的大小,则相同。 (那就是……“ArrayType[arraysize] arrayName;”,是吗?”

呃,我只是胡乱猜测。

编辑 - NullPointerException 已修复,但现在空白(白色)图像根本不会出现在框架中。编辑下面的代码以反映其新状态,添加了更多可能相关的行。

这里是所有相关代码:

JFrame controller = new JFrame("SmartHome Interface");
controller.setVisible(true);
controller.setSize(480,500);
controller.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//[...]

JPanel labelPanel = new JPanel();

//[...]

labelPanel.setBackground(Color.GREEN);

//[...]

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

//[...]

controller.add(labelPanel);

//[...]

JLabel[] labels = new JLabel[9];
        for (int i = 0; i <= 8; i++)
        {
            int xLowBound;
            int xUpBound;
            int yLowBound; 
            int yUpBound;

            //Maths for positioning the labels correctly. Should be 150px in size with 10px gaps each.
            xLowBound = (i % 3) * 160;
            xUpBound = xLowBound + 150;
            yLowBound = (i / 3) * 160;
            yUpBound = yLowBound + 150;

            labels[i] = new JLabel();
            labels[i].setIcon(blank);
            labels[i].setBounds(xLowBound, yLowBound, xUpBound, yUpBound);
            labelPanel.add(labels[i]);
        }

另外.....ImageIcon 的文件路径是否正确? 代码本身位于“src/smarthome”中,图像位于“src/Images”中

如果我违反了任何论坛约定/行为准则/等,我们深表歉意。纽比在这里,尽量小心不要,但我可能忘记了什么。

【问题讨论】:

    标签: java swing nullpointerexception jpanel imageicon


    【解决方案1】:

    您的问题简化为:

    JLabel[] labels = null;
    for (int i = 0; i <= 8; i++) {
        labels[i].setIcon(blank);
    }
    

    此代码片段将失败,因为标签 == null。因此标签[i] == null。

    改用这个:

    JLabel[] labels = new JLabel[9];
    for (int i = 0; i <= 8; i++) {
        labels[i] = new JLabel();
        labels[i].setIcon(blank);
    }
    

    【讨论】:

    • 谢谢,我已经完全按照你所说的做了,我不再遇到错误,但是空白(白色)图像根本没有出现在框架上。
    【解决方案2】:

    您的 imageIcons 文件路径不正确。你应该使用:

    ImageIcon img = new ImageIcon(getClass().getResource("../Images/blank.jpg"));    
    

    如果您的代码是静态方法,请使用:

    ImageIcon img = new ImageIcon(YourClass.class.getResource("../Images/blank.jpg"));
    

    有一个很好的answer关于加载图像图标(感谢nIcE cOw)。


    将所有组件添加到框架后,您应该调用setVisible()setSize()


    将组件添加到框架的内容窗格(frame.getContentPane())。


    您始终应该将您的 GUI 代码放在单独的线程中。


    因此,您的代码将是:

    SwingUtilities.invokeLater(new Runnable()
    {
    
        @Override
        public void run()
        {
            JFrame controller = new JFrame("SmartHome Interface");
            controller.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            JPanel labelPanel = new JPanel();
    
            labelPanel.setBackground(Color.GREEN);
    
            // !!!
            ImageIcon blank = new ImageIcon(YourClass.class
                    .getResource("../Images/blank.jpg"));
    
            // !!!
            controller.getContentPane().add(labelPanel);
    
            JLabel[] labels = new JLabel[9];
            for (int i = 0; i <= 8; i++)
            {
                int xLowBound;
                int xUpBound;
                int yLowBound;
                int yUpBound;
    
                xLowBound = (i % 3) * 160;
                xUpBound = xLowBound + 150;
                yLowBound = (i / 3) * 160;
                yUpBound = yLowBound + 150;
    
                labels[i] = new JLabel();
                labels[i].setIcon(blank);
                labels[i].setBounds(xLowBound, yLowBound, xUpBound,
                        yUpBound);
                labelPanel.add(labels[i]);
            }
    
            // !!!    
            controller.setVisible(true);
            controller.setSize(480, 500);
    
        }
    });
    

    【讨论】:

    • 请不要在同一个线程上发布多个答案,而是编辑这个以包含其他两个。这样你就赢了t loose these points you have earned. Though, even though the GUI is started on the EDT, still calls like pack()/setVisible()` 必须在将所有组件添加到容器之后,而不是在那之前。之前这样做会产生令人讨厌的结果:-)
    • 我的 +1 来了,虽然关于路径的事情,请参考这个answer :-)
    猜你喜欢
    • 2015-02-28
    • 2020-05-25
    • 1970-01-01
    • 2023-03-23
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多