Java-通过循环(NullPointerException)用ImageIcons填充JLabel数组
基本目标是使JPanel以3x3的模式填充9个白色方块;正方形是150x150空白白色.jpg文件。它必须是这样的,因为稍后,程序将不得不改变空白方格中的一个简单的图像选择,并必须能够随时改变任何方块。 问题很简单,就是我得到了一个NullPointerException。我不得不假设这与将数组初始化为null有关,但是如果我不这样做,NetBeans(是的,NetBeans…)似乎会对我生气。如果我试图声明数组的大小,也是一样的。(那将是……)ArrayType[arraysize]arrayName;“,是吗?” 我只是胡乱猜 编辑-NullPointerException已修复,但现在空白(白色)图像根本不出现在帧中。下面的代码经过编辑以反映其新状态,添加了更多可能相关的行 以下是所有相关代码: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
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,但关于路径内容,请参考此:-)