我正在使用此代码创建JCheckBox

private final JCheckBox cbDisplayMessage = new JCheckBox("Display");

        cbDisplayMessage.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            if(e.getItemSelectable() == cbDisplayMessage) {
                  if(cbDisplayMessage.isSelected()) {
                     cbDisplayMessage.setSelected(false);
                  } else {
                     cbDisplayMessage.setSelected(true);
                  }


            }
        }
    });


当我运行此命令时,它将在setSelected(true)上引起StackOverflow错误。无法弄清楚我在做什么错。任何想法表示赞赏。

最佳答案

您可以尝试使用ActionListener代替ItemListener,如下所示,而不会引起StackOverflow错误。

cbDisplayMessage.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (cbDisplayMessage.isSelected()) {
            cbDisplayMessage.setSelected(false);
        } else {
            cbDisplayMessage.setSelected(true);
        }
    }
});


无需再次检查事件的源,因为您确定已在同一对象上添加了此侦听器。仅当为更多组件添加了相同的侦听器时才需要这样做。



-编辑-

现在,您的要求对我很清楚。如果要切换复选框的状态,则无需使用侦听器,因为这是复选框的默认行为。

07-24 13:36