基本目标是让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”
中如果我违反了任何论坛惯例/行为准则/等等,我会道歉。在这里,我试着小心不要,但我可能已经忘记了什么。
答案 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);
}
});