Java - 通过循环使用ImageIcons填充JLabel数组(NullPointerException)

时间:2013-08-03 13:11:37

标签: java swing nullpointerexception jpanel imageicon

基本目标是让JPanel以3x3图案填充9个白色方块;正方形是150x150空白白.jpg文件。它必须是这种方式,因为以后,程序将必须将空白方块更改为选择的简单图像之一,并且必须能够随时更改任何方块。 简单来说,问题是我得到一个NullPointerException。我必须假设它与将数组初始化为null有关,但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”

如果我违反了任何论坛惯例/行为准则/等等,我会道歉。在这里,我试着小心不要,但我可能已经忘记了什么。

2 个答案:

答案 0 :(得分:2)

你的问题减少到了:

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

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

请改用:

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

答案 1 :(得分: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);

    }
});