我希望 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/