首页 > 解决方案 > Jcheckbox 在 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());
    }
}

标签: javaswingjcheckbox

解决方案


除非您在循环中编写代码,否则 Java 中的代码会运行一次。您正在检查复选框是否在面板中创建后立即被选中。该代码正在检查您新添加的复选框是否被选中(当然还没有人单击它们)然后完成。他们再也不会被检查。

解决方案是将此选择检查移动到事件处理程序中。但在我们到达那里之前,您的代码中有第二个错误。

while(res.next()){
    checkBoxes.add(new JCheckBox(res.getString("NAME")));
    panel.add(new JCheckBox(res.getString("NAME")));
};

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


推荐阅读