我看过很多网站。如果没有面板,标签会正确显示,面板会显示错误:
Exception in thread "main" java.lang.NullPointerException
所以我该怎么做才能解决这个问题?
这是源代码:
JLabel button[] = new JLabel[100];
JPanel[] panel = new JPanel[100];
for (int i = 0; i < button.length; i++) {
a = a + 50;
if (a > 549) {
b = b + 50;
a = 50;
}
button[i] = new JLabel("hi");
frame.add(button[i]); //is this necessary?
button[i].setVisible(true); // is this necessary?
button[i].setSize(50,50);
panel[i].add(button[i]);
panel[i].setVisible(true);
panel[i].setBounds(a, b, 50, 50);
frame.add(panel[i]);
}
这有什么不对,我该如何解决?只是你知道,它应该有100个标签,在10乘10阵列中说你好。 这是它的样子:
答案 0 :(得分:5)
创建JPanel
数组只会创建数组。它不会创建任何JPanel
来填充数组。因此,数组填充null
s。您必须为数组的每个元素创建一个JPanel:
panel[i] = new JPanel();
panel[i].add(button[i]);
此外,一个组件可能只有一个祖先。必须将按钮添加到框架或面板,但不能同时添加到两者。如果您想要面板中的按钮,则必须将其添加到面板中。
默认情况下,组件是可见的(除了必须使其可见的框架或对话框等顶级组件外)。您无需致电button.setVisible(true)
。
您肯定应该学会使用布局管理器,而不是明确地设置组件的大小和范围。这是拥有漂亮,便携的GUI应用程序的唯一方法。阅读http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html
答案 1 :(得分:3)
请勿使用frame.setLayout(null);
代替frame.setLayout(new GridLayout(10,10,10,10));,例如
import java.awt.*;
import javax.swing.*;
public class CustomComponent1 extends JFrame {
private static final long serialVersionUID = 1L;
public CustomComponent1() {
setTitle("Custom Component Test / GridLayout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void display() {
setLayout(new GridLayout(10, 10, 10, 10));
for (int row = 0; row < 100; row++) {
add(new CustomComponents1());
}
//pack();
// enforces the minimum size of both frame and component
setMinimumSize(getMinimumSize());
setPreferredSize(getPreferredSize());
setVisible(true);
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
CustomComponent1 main = new CustomComponent1();
main.display();
}
};
javax.swing.SwingUtilities.invokeLater(r);
}
}
class CustomComponents1 extends JLabel {
private static final long serialVersionUID = 1L;
@Override
public Dimension getMinimumSize() {
return new Dimension(20, 20);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(20, 20);
}
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
}