我正在使用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")));
};
您添加到checkboxes数据结构中的复选框和添加到面板中的复选框是两个不同的复选框。每次在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());
}
}
});
}