问题描述
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];
移出循环将防止您在每次循环运行时覆盖此值。
此外,为了更好地区分类名和变量,最好以小写字母开头变量。