java - 使用 Checkboxes 和 ButtonGroup clearSelection
问题描述
我想在 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]);
}
推荐阅读
- c# - 全局错误捕获以防止运行时异常导致程序崩溃
- python - 在 Python 中加速打字自动化
- java - Fragments 在发布应用程序 android 中自动开始重新加载
- c++ - 为什么我从随机数中得到相同的答案?
- sql - 客户列表 IN 和 NOT IN
- linux - 解析 html 元素的内容时,Grep 无法识别的选项“-->”
- python - 如何从python中的交互式shell中打破无限生成器循环
- django-rest-framework - 带有超链接模型序列化程序的可浏览 api 中未显示路由器的基本 url
- jenkins - Jenkins withCredentials 秘密不适用于共享库
- opencv - EmguCV4 中 Mat、MCvMat、Image、MIplImage、ScalarArray、Matrix 之间的区别