JCheckBox[x] 为空?

问题描述

我只用代码创建了一个新项目,其中包含错误

package benutzerschnittstelle;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JCheckBox;

public class versuch extends JFrame {
  private static JPanel contentPane;
  static JCheckBox[] CheckBox;

  public static void main(String[] args) {
    EventQueue.invokelater(new Runnable() {
      public void run() {
        try {
          versuch frame = new versuch();
          frame.setVisible(true);

          for (int x = 0; x < 3; x++) {
            CheckBox = new JCheckBox[3];
            CheckBox[x] = new JCheckBox("Prüfungsfach");
            CheckBox[x].setBounds(180,(60 + (25 * x)),120,21);
            contentPane.add(CheckBox[x]);
          }

          for (int x = 0; x < 3; x++) {
            try {
              System.out.println("checkBox " + x
                      + " : " + CheckBox[x].isSelected());
            } catch (Exception e) {
              System.out.println("error at checkBox " + x
                      + " : " + e.getLocalizedMessage());
            }
          }
        } catch (Exception e) {
          e.printstacktrace();
        }
      }
    });
  }

  public versuch() {
    setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100,100,450,300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5,5,5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
  }
}

由于复选框在我有机会选择它们之前就被选中,输出应该是:

checkBox 0: false
checkBox 1: false
checkBox 2: false

输出是:

error at checkBox 0 : Cannot invoke "javax.swing.JCheckBox.isSelected()" because "benutzerschnittstelle.versuch.CheckBoxPruefungsfach[x]" is null
error at checkBox 1 : Cannot invoke "javax.swing.JCheckBox.isSelected()" because "benutzerschnittstelle.versuch.CheckBoxPruefungsfach[x]" is null
checkBox 2 : false

如果我改变数组的长度,最后一个复选框总是按预期工作,其余的会导致错误......为什么会这样?我该如何解决

解决方法

在这个循环中:

for(int x = 0; x < 3; x++)
{
    CheckBox = new JCheckBox[3];
    CheckBox[x] = new JCheckBox("Prüfungsfach");
    CheckBox[x].setBounds(180,(60 + (25 * x)),120,21);
    contentPane.add(CheckBox[x]);
}

您正在循环内重新分配数组 CheckBox 。这将覆盖当前 x 之前的所有值。因此,在最后一次迭代中,您将索引 0 和 1 处的框重置为 null

在循环之前移动数组的初始化以解决问题。

对于一组复选框es来说,

CheckBox 也是一个相当糟糕的名称。对集合使用复数名称(并且按照约定,Java 中的变量名称以小写字母开头:camelCase)。

,

问题是每次循环运行时你都会创建一个新数组,因为你在循环体内分配它

for(int x = 0; x < 3; x++) {
    CheckBox = new JCheckBox[3];
    CheckBox[x] = new JCheckBox("Prüfungsfach");
    CheckBox[x].setBounds(180,21);
    contentPane.add(CheckBox[x]);
}

CheckBox = new JCheckBox[3]; 移出循环将防止您在每次循环运行时覆盖此值。

此外,为了更好地区分类名和变量,最好以小写字母开头变量。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...