在Java Swing中取消选择单选按钮

时间:2010-03-09 11:43:02

标签: java swing radio-button

当显示一组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);
    }
}

任何想法?谢谢!

10 个答案:

答案 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);

    }
}