【问题标题】:java swing nullpointer exeption whilst adding buttons [duplicate]添加按钮时java swing空指针异常[重复]
【发布时间】:2022-07-07 13:53:40
【问题描述】:

solution

所以我试图为一个学校项目做一个 java-swing-gui,因此我必须向一个 JPanel 元素添加 72 个按钮 (idk)。 我尝试使用 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);
    }
}

【问题讨论】:

  • 你还没有初始化数组的内容
  • 在创建对象数组时,数组的内容初始设置为null(每个元素),需要在数组中填充值才能使用。您可以使用循环来创建每个元素并填充面板。此外,setSize 在这种情况下不会做任何事情

标签: java swing for-loop nullpointerexception jbutton


【解决方案1】:

当你像这样创建一个数组时:

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

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

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

但如果你不这样做,fields[i] 将默认为null,因此当你尝试执行field.setSize(20, 20) 时,该字段为空并会导致NullPointerException

原始数组也有默认值。例如int数组的元素都是0boolean数组的元素都是false。对于非原始数组(如JButton)也是如此,默认情况下元素都是null

您的最终代码将如下所示:

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);
}

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

【讨论】:

  • 非常感谢 SMMH,帮我解决了这个问题
  • @JonasHaardoerfer 没问题的人,你能把我的答案指定为正确答案,这样它就会得到一个绿色的复选标记吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
相关资源
最近更新 更多