Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';我不能让ItemListener为JCheckBox工作_Java_Swing - Fatal编程技术网

Java Can';我不能让ItemListener为JCheckBox工作

Java Can';我不能让ItemListener为JCheckBox工作,java,swing,Java,Swing,我正在使用这段代码创建一个JCheckBox private final JCheckBox cbDisplayMessage = new JCheckBox("Display"); cbDisplayMessage.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if(e.getItemS

我正在使用这段代码创建一个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上导致StackOverflow错误(true)。不知道我做错了什么。任何值得欣赏的想法……

每次状态更改时都会调用您的侦听器,但您会从该侦听器中触发一个新的状态更改,因此每次状态更改都会导致该侦听器被反复调用,直到堆栈满为止。要执行类似操作,您的设置必须稍微复杂一些-如果您想更改正在侦听的组件的状态,您需要删除其侦听器,启动编程状态更改,然后重新添加它们。

您可以尝试使用
ActionListener
而不是
ItemListener
,如下所示,而不会导致
StackOverflow
错误

cbDisplayMessage.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (cbDisplayMessage.isSelected()) {
            cbDisplayMessage.setSelected(false);
        } else {
            cbDisplayMessage.setSelected(true);
        }
    }
});
无需再次检查事件源,因为您确定已在同一对象上添加了此侦听器。仅当为更多组件添加了相同的侦听器时,才需要这样做


--编辑--


现在我清楚你的要求了。如果要切换复选框的状态,则无需使用listener,因为这是复选框的默认行为。

必须检查事件是否由人发起,因为
setSelected
再次调用相同的方法。或者检查一下System.currentTimeMillis(),给自己100毫秒的最小偏移量来确认状态的变化。谢谢你的回答-我已经试过使用ActionListener了。当我使用它时,单击复选框时不会发生任何事情。我以为你必须使用带有复选框的ItemListeners。现在告诉我你想要什么。根据您的代码,您正在限制用户交互。如果选择了它,那么您将有问题地将其设置回false。是吗?是的,没错,如果没有选择,那么我想将其设置为true。简单的状态切换…尝试使用
ActionListener
现在你让我感到困惑。如果您想切换状态,那么不要添加任何简单的侦听器。