首页 > 解决方案 > 使用 Checkboxes 和 ButtonGroup clearSelection

问题描述

我想在 ButtonGroup 中有一定数量的复选框。这些复选框在打开和关闭时使用 ItemListener 发送消息,但是我也希望能够取消选中所有框。

我如何在单击之前找出复选框的先前状态,因为 ButtonGroup 使得当我尝试取消选中我的框时,它会发送另一个 ActionEvent 与框已经处于相同的真实状态。

(我使用复选框而不是单选按钮,因为这是我正在处理的整个窗口的当前格式,所以我想在面板上保持一致)。

这是一些入门代码:

    JPanel p = new JPanel();

    ButtonGroup g = new ButtonGroup();

    JCheckBox[] boxes = new JCheckBox[3];
    String[] s = {"a", "b", "c"};
    for (int i = 0 ; i < 3; i++) {
        boxes[i] = new JCheckBox(s[i]);
        boxes[i].addActionListener(obj -> {
            JCheckBox box = (JCheckBox)obj.getSource();
            if (box.isSelected()) {
                g.clearSelection();
                //System.out.println("ACTION: " + box.getText() + " " + box.isSelected());
            }

        });
        boxes[i].addItemListener( obj-> {
            JCheckBox box = (JCheckBox)obj.getSource();
            if (!box.isSelected()) {
                System.out.println("  ITEM: " + box.getText() + " " + box.isSelected());
            }
        });
        g.add(boxes[i]);
        p.add(boxes[i]);
    }

标签: javaswingjcheckboxbuttongroup

解决方案


弄清楚了。我们根本不需要 ActionListener。我们只需要修改 ButtonGroup 类。

    ButtonGroup g = new ButtonGroup() {
        private ButtonModel prev;
        @Override
        public void setSelected(ButtonModel m, boolean b) {
            prev = getSelection();
            if (prev != null) {
                if (prev.isSelected() && !b) {
                    clearSelection();
                } else {
                    super.setSelected(m, b);
                }
            }
            else {
                super.setSelected(m, b);
            }
        }
    };

完成代码:

    JPanel p = new JPanel();

    ButtonGroup g = new ButtonGroup() {
        private ButtonModel prev;
        @Override
        public void setSelected(ButtonModel m, boolean b) {
            prev = getSelection();
            if (prev != null) {
                if (prev.isSelected() && !b) {
                    clearSelection();
                } else {
                    super.setSelected(m, b);
                }
            }
            else {
                super.setSelected(m, b);
            }
        }
    };

    JCheckBox[] boxes = new JCheckBox[3];
    String[] s = {"a", "b", "c"};
    for (int i = 0 ; i < 3; i++) {
        boxes[i] = new JCheckBox(s[i]);
        boxes[i].addItemListener( obj-> {
            JCheckBox box = (JCheckBox)obj.getSource();
            System.out.println("  ITEM: " + box.getText() + " " + box.isSelected());
        });
        g.add(boxes[i]);
        p.add(boxes[i]);
    }

推荐阅读