Jcheckbox 在 Swing 中总是返回 false Java
Jcheckbox always returnig false in Swing Java
我正在使用 Java 和 Swing,我只想测试 Jcheckbox 是否被选中,如果是,则将其文本添加到字符串列表中,问题是 isSelected 函数总是返回 False,即使复选框被选中。
这是我写的代码:
List<JCheckBox> checkBoxes = new ArrayList<JCheckBox>();
List<String> infos = new ArrayList<String>();
String sql = "select NAME from drugs ";
pre=con.prepareStatement(sql);
res=pre.executeQuery();
while(res.next()){
checkBoxes.add(new JCheckBox(res.getString("NAME")));
panel.add(new JCheckBox(res.getString("NAME")));
};
for (JCheckBox checkBox : checkBoxes) {
if (checkBox.isSelected()) {
infos.add(checkBox.getText());
}
}
Java 运行 中的代码一次通过,除非你在循环中编写代码。您正在检查复选框在面板中创建后是否立即被选中。该代码正在检查您新添加的复选框是否被选中(当然还没有人点击它们)然后完成。他们再也不会被检查了。
解决方案是将此选择检查移动到事件处理程序中。但是在我们到达那里之前,您的代码中有第二个错误。
while(res.next()){
checkBoxes.add(new JCheckBox(res.getString("NAME")));
panel.add(new JCheckBox(res.getString("NAME")));
};
添加到复选框数据结构的复选框和添加到面板的复选框是两个不同的复选框。每次在 Java 中使用 new 关键字时,都会创建一个 new 独立对象 。在您的情况下,您真正需要的是创建 1 个新复选框,并将其放入面板中,并将其存储在您的数据结构中。
解决方法:
while(res.next()){
JCheckBox checkBox = new JCheckBox(res.getString("NAME"));
checkBoxes.add(checkBox);
panel.add(checkBox);
};
现在我们可以继续创建事件处理程序。事件处理程序将 对单击复选框的人做出 反应,并 运行 检查复选框状态以应用任何更改的代码。可以按如下方式编写适合您需要的事件处理程序示例:
checkBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
infos.add(checkBox.getText());
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
infos.remove(checkBox.getText());
}
}
});
现在,当我们将代码与所有修复程序结合在一起时,我们得到:
while(res.next()){
JCheckBox checkBox = new JCheckBox(res.getString("NAME"));
checkBoxes.add(checkBox);
panel.add(checkBox);
checkBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
infos.add(checkBox.getText());
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
infos.remove(checkBox.getText());
}
}
});
}
我正在使用 Java 和 Swing,我只想测试 Jcheckbox 是否被选中,如果是,则将其文本添加到字符串列表中,问题是 isSelected 函数总是返回 False,即使复选框被选中。 这是我写的代码:
List<JCheckBox> checkBoxes = new ArrayList<JCheckBox>();
List<String> infos = new ArrayList<String>();
String sql = "select NAME from drugs ";
pre=con.prepareStatement(sql);
res=pre.executeQuery();
while(res.next()){
checkBoxes.add(new JCheckBox(res.getString("NAME")));
panel.add(new JCheckBox(res.getString("NAME")));
};
for (JCheckBox checkBox : checkBoxes) {
if (checkBox.isSelected()) {
infos.add(checkBox.getText());
}
}
Java 运行 中的代码一次通过,除非你在循环中编写代码。您正在检查复选框在面板中创建后是否立即被选中。该代码正在检查您新添加的复选框是否被选中(当然还没有人点击它们)然后完成。他们再也不会被检查了。
解决方案是将此选择检查移动到事件处理程序中。但是在我们到达那里之前,您的代码中有第二个错误。
while(res.next()){
checkBoxes.add(new JCheckBox(res.getString("NAME")));
panel.add(new JCheckBox(res.getString("NAME")));
};
添加到复选框数据结构的复选框和添加到面板的复选框是两个不同的复选框。每次在 Java 中使用 new 关键字时,都会创建一个 new 独立对象 。在您的情况下,您真正需要的是创建 1 个新复选框,并将其放入面板中,并将其存储在您的数据结构中。
解决方法:
while(res.next()){
JCheckBox checkBox = new JCheckBox(res.getString("NAME"));
checkBoxes.add(checkBox);
panel.add(checkBox);
};
现在我们可以继续创建事件处理程序。事件处理程序将 对单击复选框的人做出 反应,并 运行 检查复选框状态以应用任何更改的代码。可以按如下方式编写适合您需要的事件处理程序示例:
checkBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
infos.add(checkBox.getText());
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
infos.remove(checkBox.getText());
}
}
});
现在,当我们将代码与所有修复程序结合在一起时,我们得到:
while(res.next()){
JCheckBox checkBox = new JCheckBox(res.getString("NAME"));
checkBoxes.add(checkBox);
panel.add(checkBox);
checkBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
infos.add(checkBox.getText());
}
if (e.getStateChange() == ItemEvent.DESELECTED) {
infos.remove(checkBox.getText());
}
}
});
}