当显示一组JRadioButtons时,最初没有选择它们(除非您以编程方式强制执行)。即使用户已选择按钮,我也希望能够将按钮重新置于该状态,即不应选择任何按钮。
但是,使用通常的嫌疑人无法提供所需的效果:在每个按钮上调用'setSelected(false)'不起作用。有趣的是,当按钮没有放入ButtonGroup时, 工作 - 不幸的是,后者是JRadioButtons互斥的必需品。
另外,使用setSelected(ButtonModel,boolean) - javax.swing.ButtonGroup的方法不能做我想要的。
我已经整理了一个小程序来演示效果:两个单选按钮和一个JButton。单击JButton应取消选择单选按钮,以使窗口看起来与第一次弹出时完全一样。
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
/**
* This class creates two radio buttons and a JButton. Initially, none
* of the radio buttons is selected. Clicking on the JButton should
* always return the radio buttons into that initial state, i.e.,
* should disable both radio buttons.
*/
public class RadioTest implements ActionListener {
/* create two radio buttons and a group */
private JRadioButton button1 = new JRadioButton("button1");
private JRadioButton button2 = new JRadioButton("button2");
private ButtonGroup group = new ButtonGroup();
/* clicking this button should unselect both button1 and button2 */
private JButton unselectRadio = new JButton("Unselect radio buttons.");
/* In the constructor, set up the group and event listening */
public RadioTest() {
/* put the radio buttons in a group so they become mutually
* exclusive -- without this, unselecting actually works! */
group.add(button1);
group.add(button2);
/* listen to clicks on 'unselectRadio' button */
unselectRadio.addActionListener(this);
}
/* called when 'unselectRadio' is clicked */
public void actionPerformed(ActionEvent e) {
/* variant1: disable both buttons directly.
* ...doesn't work */
button1.setSelected(false);
button2.setSelected(false);
/* variant2: disable the selection via the button group.
* ...doesn't work either */
group.setSelected(group.getSelection(), false);
}
/* Test: create a JFrame which displays the two radio buttons and
* the unselect-button */
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
RadioTest test = new RadioTest();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout(3,1));
contentPane.add(test.button1);
contentPane.add(test.button2);
contentPane.add(test.unselectRadio);
frame.setSize(400, 400);
frame.setVisible(true);
}
}
任何想法?谢谢!
答案 0 :(得分:47)
你可以buttonGroup.clearSelection()
。
但是这种方法仅在Java 6之后才可用。
答案 1 :(得分:5)
类ButtonGroup
的Javadoc本身就如何实现这一点提供了一些暗示:
来自班级ButtonGroup
的API文档:
最初,组中的所有按钮都是未选中的。选择任何按钮后,组中始终会选择一个按钮。无法以编程方式将按钮设置为“关闭”,以便清除按钮组。 要显示“未选择”的外观,请向该组添加一个不可见的单选按钮,然后以编程方式选择该按钮以关闭所有显示的单选按钮。 的
答案 2 :(得分:3)
尝试向按钮组添加第三个不可见按钮。如果要“取消选择”,请选择不可见的。
答案 3 :(得分:3)
或者你可以使用Darryl的Select Button Group,它不需要你使用“隐形按钮”。
答案 4 :(得分:1)
您可以使用点击计数器:
private ButtonGroup radioGroup = new javax.swing.ButtonGroup();
private JRadioButton jRadioBtn1 = new javax.swing.JRadioButton();
private int clickCount = 0;
private void jRadioBtn1Clicked(java.awt.event.MouseEvent evt) {
// Remove selection on a second click
if (jRadioBtn1.isSelected()) {
if (++clickCount % 2 == 0) {
radioGroup.clearSelection();
}
}
}
答案 5 :(得分:0)
您可以使用setselected(false)
方法取消选择之前选择的按钮。
答案 6 :(得分:0)
我不知道这是否会有所帮助,但您是否尝试使用doClick()
方法?
jRadioButtonYourObject.doClick();
输入 - 无
返回 - 无效
我有一个类似的问题,并尝试了这个线程中的一切无济于事。所以我看了一下JRadioButton的所有方法,并从JRadioButton的父类中找到了这个方法。
在我的程序中,我有两个独立的单选按钮,它被编程,因此只选择了一个。
用户输入数据并点击按钮后,程序将清除所有文本字段和区域,并取消选择单选按钮。 doClick()
完成了为我取消选择单选按钮的工作;方法“执行”点击“。”
我知道你的不同,你可能需要为所选的每个单选按钮编写doClick()方法。
http://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html
搜索doClick()
答案 7 :(得分:0)
如果要取消选择,请选择不可见。为此,您可以向按钮组添加第三个不可见按钮。
答案 8 :(得分:0)
在我的例子中,我使用Jgoodies项目将GUI组件绑定到Java模型。 RadioButton组件绑定到字段
class Model {
private SomeJavaEnum field; // + getter, setter
}
在这种情况下,ButtonGroup.clearSelection
不起作用,因为旧值仍保留在模型中。直截了当的解决方案只是setField(null)
。
答案 9 :(得分:0)
使用此帮助程序类SelectButtonGroup.java
直接链接到班级source
import java.awt.*;
import java.awt.event.ActionListener;
import javax.swing.*;
public class SelectUnselected extends JPanel {
private static String birdString = "Bird";
private static String catString = "Cat";
private static Integer selectedIndex = -1;
private static AbstractButton hiddenButton = new JRadioButton(catString);
private final static AbstractButton birdButton = new JRadioButton(birdString);
private final static AbstractButton catButton = new JRadioButton(catString);
//Group the radio buttons.
private SelectButtonGroup group = new SelectButtonGroup();
public SelectUnselected() {
super(new BorderLayout());
//Create the radio buttons.
hiddenButton.setVisible(false);
hiddenButton.setSelected(true);
group.add(birdButton);
group.add(catButton);
group.add(hiddenButton);
ActionListener sendListener = e -> {
checkSelectedRadioButten();
};
birdButton.addActionListener(sendListener);
catButton.addActionListener(sendListener);
hiddenButton.addActionListener(sendListener);
//Put the radio buttons in a column in a panel.
JPanel radioPanel = new JPanel(new GridLayout(0, 1));
radioPanel.add(birdButton);
radioPanel.add(catButton);
add(radioPanel, BorderLayout.LINE_START);
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
}
public void checkSelectedRadioButten(){
System.out.println("selectedIndex = " + selectedIndex + "\ngroup.getSelectedButton() = " + group.getSelectedIndex());
if(group.getSelectedIndex() == selectedIndex){
hiddenButton.setSelected(true);
selectedIndex = -1;
System.out.println("getText = " + group.getSelectedButton().getText());
}else{
selectedIndex = group.getSelectedIndex();
System.out.println("getText = " + group.getSelectedButton().getText());
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("RadioButtonDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new SelectUnselected();
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
}