Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-通过循环(NullPointerException)用ImageIcons填充JLabel数组_Java_Swing_Nullpointerexception_Jpanel_Imageicon - Fatal编程技术网

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

Java-通过循环(NullPointerException)用ImageIcons填充JLabel数组,java,swing,nullpointerexception,jpanel,imageicon,Java,Swing,Nullpointerexception,Jpanel,Imageicon,基本目标是使JPanel以3x3的模式填充9个白色方块;正方形是150x150空白白色.jpg文件。它必须是这样的,因为稍后,程序将不得不改变空白方格中的一个简单的图像选择,并必须能够随时改变任何方块。 问题很简单,就是我得到了一个NullPointerException。我不得不假设这与将数组初始化为null有关,但是如果我不这样做,NetBeans(是的,NetBeans…)似乎会对我生气。如果我试图声明数组的大小,也是一样的。(那将是……)ArrayType[arraysize]array

基本目标是使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]);
        }
JFrame控制器=新的JFrame(“智能家庭接口”);
controller.setVisible(true);
控制器。设置大小(480500);
控制器.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//[...]
JPanel labelPanel=新的JPanel();
//[...]
标签面板。背景(颜色。绿色);
//[...]
ImageIcon blank=新的ImageIcon(“../Images/blank.jpg”);
//[...]
控制器。添加(labelPanel);
//[...]
JLabel[]标签=新的JLabel[9];

对于(int i=0;i,您的问题归结为:

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

对于(int i=0;i,您的问题归结为:

JLabel[] labels = null;
for (int i = 0; i <= 8; i++) {
    labels[i].setIcon(blank);
}
JLabel[]标签=null;
对于(int i=0;i
您的imageIcons文件路径不正确。您应该使用:

ImageIcon img = new ImageIcon(getClass().getResource("../Images/blank.jpg"));    
如果您的代码是静态方法,请使用以下方法:

ImageIcon img = new ImageIcon(YourClass.class.getResource("../Images/blank.jpg"));
加载图像图标有一个很好的方法(多亏了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);

    }
});
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
JFrame控制器=新JFrame(“智能家庭接口”);
控制器.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel labelPanel=新的JPanel();
标签面板。背景(颜色。绿色);
// !!!
ImageIcon blank=新的ImageIcon(YourClass.class
.getResource(“../Images/blank.jpg”);
// !!!
controller.getContentPane().add(labelPanel);
JLabel[]标签=新的JLabel[9];
对于(int i=0;i
您的imageIcons文件路径不正确。您应该使用:

ImageIcon img = new ImageIcon(getClass().getResource("../Images/blank.jpg"));    
如果您的代码是静态方法,请使用以下方法:

ImageIcon img = new ImageIcon(YourClass.class.getResource("../Images/blank.jpg"));
加载图像图标有一个很好的方法(多亏了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);

    }
});
SwingUtilities.invokeLater(新的Runnable()
{
@凌驾
公开募捐
{
JFrame控制器=新JFrame(“智能家庭接口”);
控制器.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel labelPanel=新的JPanel();
标签面板。背景(颜色。绿色);
// !!!
ImageIcon blank=新的ImageIcon(YourClass.class
.getResource(“../Images/blank.jpg”);
// !!!
controller.getContentPane().add(labelPanel);
JLabel[]标签=新的JLabel[9];

对于(int i=0;谢谢,我已经完全按照你在那里说的做了,我不再得到错误,但是空白(白色)图像根本没有出现在帧上。谢谢,我完全按照你在那里说的做了,我不再得到错误,但是空白(白色)图像根本没有出现在框架上。请不要在同一个线程上发布多个答案,而是编辑此答案以包含其他两个答案。这样您就不会失去您已获得的这些分数。尽管GUI是在EDT上启动的,但仍会调用类似于
pack()/setVisible()的调用`必须在将所有组件添加到容器之后,而不是之前。在之前执行此操作可能会产生令人讨厌的结果:-)下面是my+1,但关于路径内容,请参考此:-)请不要在同一个线程上发布多个答案,而是编辑此答案以包含其他两个答案。这样您就不会失去您已获得的分数。尽管GUI在EDT上启动,但仍会调用类似于
pack()/setVisible()`必须在将所有组件添加到容器之后,而不是之前。在之前执行此操作可能会产生令人讨厌的结果:-)下面是my+1,但关于路径内容,请参考此:-)