java - 使用复选框和 ButtonGroup 清除选择

标签 java swing jcheckbox buttongroup

我希望 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]);
    }

最佳答案

想通了。我们根本不需要 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]);
    }

关于java - 使用复选框和 ButtonGroup 清除选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58848119/

相关文章:

java - 如何在 Netty 中根据 URI 路由请求?

java - NetBeans + Microsoft SQL Server 2012 jbdc 驱动程序

java - 从 Swing 应用程序创建 Web 应用程序

java - 选中 JTable 中的复选框时的通知

java - 当动态生成 JcheckBoxes 时,如何将它们链接到 JtextFields?

java - 如何正确处理 JWT 刷新?

java - 请求在 postman 中工作正常,但在 OkHTTP 中收到 403

Java swing 如何启用 JScrollPane 的拖动/导出​​选项

java - 带方形边框的 JCheckBox

java - 我的世界 Bukkit : Command not working