【问题标题】:JCheckBox array initialization or access issueJCheckBox 数组初始化或访问问题
【发布时间】:2013-08-11 02:10:45
【问题描述】:

为了使我的程序更短,我使用数组和循环来完成一项任务,但我遇到了问题。我不确定我是初始化数组错误还是访问错误。我正在初始化一个包含 40 个 JCheckBox 的数组。

JCheckBox[] seatz={chk_a1,chk_a2,chk_a3,chk_a4,chk_a5,chk_a6,chk_a7,chk_a8,chk_a9,chk_a10,chk_b1,chk_b2...chk_d10};

每当 JCheckBox 的项目状态发生更改时,都会调用 seatChecker() 方法

public void seatChecker(JCheckBox chkbox) {
    if(chkbox.isSelected()){
        chkboxcount=chkboxcount+1;
    } else {
        chkboxcount=chkboxcount-1;
    }
    if(chkboxcount>=totalseats){
        disableSeats();
    } else {
        enableSeats();
    }
}

如果计数达到某个限制,我将在此处禁用 JCheckBox,否则启用它们。这两种方法的代码是

    public void disableSeats() {
    for(int x = 0; x < 40 ; x++) {
        if(seatz[x].isSelected()==false){
            seatz[x].setEnabled(false);
        }
    }
}

public void enableSeats() {
    for(int x = 0; x < 40 ; x++) {
        seatz[x].setEnabled(true);
    }
}

我在if(seatz[x].isSelected()==false)seatz[x].setEnabled(true) 收到错误Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 我在这里做错了什么?

【问题讨论】:

    标签: java arrays swing initialization jcheckbox


    【解决方案1】:

    你说:

    我在if(seatz[x].isSelected()==false)seatz[x].setEnabled(true) 收到错误Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 我在这里做错了什么?

    只有当 seatz[x] 为空时才会发生这种情况。

    您似乎在声明一个引用类型的数组(此处为 JCheckBox),但在使用它们之前尚未为每个数组项构造有效的非空对象。在尝试使用它们之前,您必须首先使用对有效非空对象的引用填充数组。这对于任何引用类型的数组都是一样的。

    另一种看待方式是,当您创建一个对象数组时,它就像创建一个鸡蛋盒。在您先将一些鸡蛋放入纸箱之前,您不能使用任何鸡蛋。在初始化数组之前,您不能使用数组中的任何对象,这通常在 for 循环中完成。

    即你需要先这样做:

    for (int i = 0; i < myReferenceArray.length; i++) {
      myReferenceArray[i] = new MyReference();
    }
    

    在您可以使用数组中的任何项目之前。


    顺便说一句,看到这个:

    我正在初始化一个包含 40 个 JCheckBox 的数组。

    我一直想知道 JTable 是否能更好地满足您的需求。


    注意,如果你不能使用 JTable,那么这段代码:

    JCheckBox[] seatz={chk_a1,chk_a2,chk_a3,chk_a4,chk_a5,chk_a6,chk_a7,chk_a8,chk_a9,chk_a10,chk_b1,chk_b2...chk_d10};
    

    很容易改成:

    JCheckBox[][] seats = new JCheckBox[4][10]; // magic numbers replaced by constants
    for (int row = 0; row < seats.length; row++) {
      for (int col = 0; col < seats[row].length; col++) {
        seats[row][col] = new Seat();
        seatPanel.add(seats[row][col]);
      } 
    }
    

    【讨论】:

    • @Juned Ahsan 使用 JToggleButton 获得席位
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多