0

基本目标是让 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”中

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

4

2 回答 2

2

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

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

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

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

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


您应该在将所有组件添加到框架之后调用setVisible()and 。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);

    }
});
于 2013-08-03T16:16:07.960 回答
2

您的问题简化为:

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);
}
于 2013-08-03T13:20:09.750 回答