在 Java Swing 中取消选择单选按钮
Posted
技术标签:
【中文标题】在 Java Swing 中取消选择单选按钮【英文标题】:Unselecting RadioButtons in Java Swing 【发布时间】:2011-01-25 09:45:22 【问题描述】:当显示一组 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);
有什么想法吗?谢谢!
【问题讨论】:
一个使用键绑定的例子显示在here。 【参考方案1】:尝试在按钮组中添加第三个不可见按钮。当你想“取消选择”时,选择不可见的。
【讨论】:
【参考方案2】:ButtonGroup
类的 Javadoc 本身给出了一些关于如何实现这一点的提示:
来自ButtonGroup
类的API文档:
最初,未选择组中的所有按钮。选择任何按钮后,始终会在组中选择一个按钮。无法以编程方式将按钮设置为“关闭”,以清除按钮组。 要呈现“未选择”的外观,请向组中添加一个不可见的单选按钮,然后以编程方式选择该按钮以关闭所有显示的单选按钮。
【讨论】:
哦,天哪...我觉得有些奇怪,因为我之前已经阅读过 API 文档。现在,得到这个:原来您引用的部分已从 Java 6 的 API 文档中删除!请参阅此处进行比较:java.sun.com/j2se/1.5.0/docs/api/javax/swing/ButtonGroup.html (Java 5) 和 java.sun.com/javase/6/docs/api/javax/swing/ButtonGroup.html (Java 6)。难怪我在文档中找不到任何东西...... @Thomas - 我同意。废话。呜呜。【参考方案3】:或者您可以使用 Darryl 的 Select Button Group,它不需要您使用“隐形按钮”。
【讨论】:
【参考方案4】:你可以buttonGroup.clearSelection()
。
但是这种方法只在 Java 6 之后才可用。
【讨论】:
太棒了!这就解释了为什么 ButtonGroup 的 Javadoc 删除了关于不可见 RadioButton 的部分......(现在,如果他们添加关于 clearSelection 的部分;-))【参考方案5】:您可以使用setselected(false)
方法取消选择之前选择的按钮。
【讨论】:
正如我在问题(第二段)中所说,这对我不起作用。您能否提供一个代码示例来说明您的意思?【参考方案6】:我不知道这是否会有所帮助,但您是否尝试过使用doClick()
方法?
jRadioButtonYourObject.doClick();
输入 - 无
返回-无效
我遇到了类似的问题,并尝试了该线程中的所有内容,但均无济于事。于是我查看了JRadioButton的所有方法,从JRadioButton的父类中找到了该方法。
在我的程序中,我有两个相互独立的单选按钮,它被编程为只选择了一个。
在用户输入数据并点击按钮后,程序会清除所有文本字段和区域并取消选择单选按钮。 doClick()
为我完成了取消选择单选按钮的工作;该方法“执行“点击”。”
我知道你的不同,你可能需要为每个选中的单选按钮编写 doClick() 方法。
http://docs.oracle.com/javase/7/docs/api/javax/swing/AbstractButton.html
搜索doClick()
【讨论】:
你试过doClick()
方法吗? [..] 我遇到了类似的问题,并尝试了该线程中的所有方法均无济于事。 - 我选择正确的答案对我有用。【参考方案7】:
当你想取消选择时,选择不可见。为此,您将第三个不可见按钮添加到按钮组。
【讨论】:
见 sateesh 的回答,还有 camickr 的。【参考方案8】:在我的例子中,我使用 Jgoodies 项目将 GUI 组件绑定到 Java 模型。 RadioButton 组件绑定到一个字段
class Model
private SomeJavaEnum field; // + getter, setter
在这种情况下,ButtonGroup.clearSelection
不起作用,因为旧值仍保留在模型中。直接的解决方案是简单地setField(null)
。
【讨论】:
【参考方案9】:使用这个帮助类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);
【讨论】:
【参考方案10】:您可以使用点击计数器:
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();
【讨论】:
【参考方案11】:您可以使用自己的 ButtonGroup (1),或使用修改后的实例 (2),如下所示: 仅自 JAVA 6 起:
(1) public class NoneSelectedButtonGroup extends ButtonGroup
@Override
public void setSelected(ButtonModel model, boolean selected)
if (selected)
super.setSelected(model, selected);
else
clearSelection();
(2) ButtonGroup chGroup = new ButtonGroup()
@Override
public void setSelected(ButtonModel m, boolean b)
if (!b) clearSelection();
else
super.setSelected(m, b);
;
取自https://blog.frankel.ch/unselect-all-toggle-buttons-of-a-group/
【讨论】:
以上是关于在 Java Swing 中取消选择单选按钮的主要内容,如果未能解决你的问题,请参考以下文章
Knockout + Radiobuttons - 在取消选中时将值切换回“false”