Java Swing NullPointer Exeption 同时添加按钮 [Duplicate]

java swing nullpointer exeption whilst adding buttons [duplicate]

提问人:Jonas 提问时间:3/22/2022 最后编辑:Jonas 更新时间:7/7/2022 访问量:52

问:

溶液

所以我试图为一个学校项目做一个 java-swing-gui,因此我必须将 72 个按钮 (idk) 添加到 JPanel 元素中。 我尝试使用for循环:

for (JButton btn : btns) {
    panel.add(btn);
}

但它并没有真正奏效并抛出一个 nullPointerExeption。 有什么建议吗?

以下是完整代码:

import javax.swing.*;
import javax.swing.plaf.DimensionUIResource;

import java.awt.*;

public class mädn extends JFrame{
    static JPanel panel = new JPanel();
    static JFrame frame = new JFrame();
    static JButton[] fields = new JButton[72];

    public static void main(String[] args) {
        new mädn();
    }

    public mädn() {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new DimensionUIResource(500, 500));
        frame.setTitle("Mensch Ärger Dich Nicht");

        panel.setLayout(new GridLayout(11, 11));
        panel.setBackground(Color.blue);
        
        for (JButton field : fields) {
            field.setSize(20, 20);
            panel.add(field);
        }

        frame.add(panel);
        frame.setVisible(true);
    }
}

java swing for 循环 nullpointerException jbutton

评论

2赞 MadProgrammer 3/22/2022
您尚未初始化数组的内容
0赞 MadProgrammer 3/22/2022
创建对象数组时,数组的内容最初设置为(每个元素),您需要先用值填充数组,然后才能使用它们。您可以使用循环来创建每个元素并填充面板。此外,在这种情况下,不会做任何事情nullsetSize

答:

1赞 SMMH 3/22/2022 #1

当您创建如下所示的数组时:

static JButton[] fields = new JButton[72];

该数组为空。换句话说,即使该数组能够保留 72 个按钮,它还没有这些按钮,您必须手动添加它们,如下所示:

for (int i = 0; i < 72; i++) {
    fields[i] = new JButton();
}

但是,如果您不这样做,则默认情况下将是,因此当您尝试这样做时,该字段为 null,并且会导致 .fields[i]nullfield.setSize(20, 20)NullPointerException

基元数组也有默认值。例如,数组的元素是 all,数组的元素是 all 。对于非原始数组(like )也是如此,这些元素都是默认的。int0booleanfalseJButtonnull

最终代码如下所示:

for (int i = 0; i < 72; i++) {
    fields[i] = new JButton();
    fields[i].setSize(20, 20);
    panel.add(fields[i]);
}

艺术

for (int i = 0; i < 72; i++) {
    JButton field = new JButton();
    fields[i] = field;
    field.setSize(20, 20);
    panel.add(field);
}

甚至更短:

for (int i = 0; i < 72; i++) {
    var field = fields[i] = new JButton();
    field.setSize(20, 20);
    panel.add(field);
}

还可以考虑将其转换为常量(字段)。72static final

评论

1赞 Jonas 3/23/2022
非常感谢SMMH,帮助我解决了这个问题
0赞 SMMH 3/23/2022
@JonasHaardoerfer没问题,伙计,你能把我的答案指定为正确答案,让它得到一个绿色的复选标记吗?