我正在使用此代码创建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);
}
}
});
无需再次检查事件的源,因为您确定已在同一对象上添加了此侦听器。仅当为更多组件添加了相同的侦听器时才需要这样做。
-编辑-
现在,您的要求对我很清楚。如果要切换复选框的状态,则无需使用侦听器,因为这是复选框的默认行为。