Java Can';我不能让ItemListener为JCheckBox工作
我正在使用这段代码创建一个JCheckBoxJava 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
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
现在你让我感到困惑。如果您想切换状态,那么不要添加任何简单的侦听器。