[英]How to deselect already selected JRadioButton by clicking on it
Let's say we are having some JRadioButton
s which belongs to same ButtonGroup
, when user clicks on a JRadioButton
it got selected. 比方说,我们现在遇到了
JRadioButton
属于同一个S ButtonGroup
,当用户点击JRadioButton
它得到了选择。 I want to add a feature that when user click on already selected JRadioButton
, it gets deselected, that is whole ButtonGroup
will have no JRadioButton
selected. 我想添加一个功能,当用户单击已经选择的
JRadioButton
,它将被取消选择,即整个ButtonGroup
都不会选择JRadioButton
。 I already searched which leads me hint to use, ButtonGroup
method, clearSelection. 我已经搜索过,这使我获得使用提示 ,即
ButtonGroup
方法,clearSelection。 but problem is that when user clicks on already selected JRadioButton, it is not generating any ItemStateChangeEvent
, which is generating by clicking on other unselected JRadioButton
s. 但是问题在于,当用户单击已经选择的JRadioButton时,它不会生成任何
ItemStateChangeEvent
,而该ItemStateChangeEvent
是通过单击其他未选中的JRadioButton
的。
I'd use the approach cited . 我会使用引用的方法。 Because a
JRadioButton
is a JToggleButton
, a mouse gesture is possible but problematic. 因为
JRadioButton
是JToggleButton
,所以鼠标手势是可能的但有问题。 I'd use a MouseListener
on the enclosing panel and Key Bindings on the buttons as shown below. 我将在封闭面板上使用
MouseListener
,并在按钮上使用键绑定 ,如下所示。 Click in the panel surrounding the buttons or press the escape key to clear the selection of all buttons in the ButtonGroup
. 在按钮周围的面板中单击,或按退出键以清除
ButtonGroup
中所有按钮的ButtonGroup
。
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.KeyStroke;
/**
* @see https://stackoverflow.com/a/37599961/230513
*/
public class Test {
private static final String UNSELECT = "UNSELECT";
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel p = new JPanel(new GridLayout(1, 0, 5, 5));
p.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
ButtonGroup group = new ButtonGroup();
JRadioButton r1 = create("One", group);
JRadioButton r2 = create("Two", group);
p.add(r1);
p.add(r2);
p.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
group.clearSelection();
}
});
f.add(p);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private JRadioButton create(String name, ButtonGroup group) {
JRadioButton b = new JRadioButton(name);
group.add(b);
b.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), UNSELECT);
b.getActionMap().put(UNSELECT, new AbstractAction(UNSELECT) {
@Override
public void actionPerformed(ActionEvent e) {
group.clearSelection();
}
});
return b;
}
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
}
Or, as an alternate approach, override ButtonGroup#setSelected(...)
: 或者,作为替代方法,重写
ButtonGroup#setSelected(...)
:
import java.awt.*;
import java.util.Arrays;
import javax.swing.*;
public class Test2 {
public JComponent makeUI() {
JPanel p = new JPanel(new GridLayout(2, 1));
p.add(makePanel("Default ButtonGroup", new ButtonGroup()));
p.add(makePanel("Custom ButtonGroup", new ButtonGroup() {
private ButtonModel prevModel;
private boolean isAdjusting = false;
@Override public void setSelected(ButtonModel m, boolean b) {
if (isAdjusting) {
return;
}
if (m.equals(prevModel)) {
isAdjusting = true;
clearSelection();
isAdjusting = false;
} else {
super.setSelected(m, b);
}
prevModel = getSelection();
}
}));
return p;
}
private JComponent makePanel(String title, ButtonGroup g) {
JPanel p = new JPanel();
p.setBorder(BorderFactory.createTitledBorder(title));
for (String s: Arrays.asList("aaa", "bbb", "ccc")) {
AbstractButton r = new JRadioButton(s);
//AbstractButton r = new JToggleButton(s);
p.add(r);
g.add(r);
}
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new Test2().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.