Java 如何在JFrame中取消选择单选按钮

Java 如何在JFrame中取消选择单选按钮,java,swing,jframe,Java,Swing,Jframe,我想取消选择我的单选按钮,我在我的程序在JFrame,它存在一些方法来取消选择所有单选按钮通过一个按钮称为清洁?此按钮将清除收音机按钮和显示的文本 执行的行动准则将使所有人认为: JButton btnClean = new JButton("Clean"); btnClean.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {

我想取消选择我的单选按钮,我在我的程序在JFrame,它存在一些方法来取消选择所有单选按钮通过一个按钮称为清洁?此按钮将清除收音机按钮和显示的文本

执行的行动准则将使所有人认为:

JButton btnClean = new JButton("Clean");
        btnClean.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {


            }
        });
        btnClean.setBounds(208, 184, 126, 28);
        contentPane.add(btnClean);

通常,JRadioButton被分组在ButtonGroup对象中,ButtonGroup对象是一个逻辑对象,一次只允许选择一个JRadioButton。您要做的是在此ButtonGroup对象上调用
clearSelection()

另一方面,您似乎在GUI中使用
null
布局。虽然空布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

比如说

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class BunchOButtons extends JPanel {
    private static final String[] RADIO_TEXTS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    private ButtonGroup weekDayBtnGroup = new ButtonGroup();

    public BunchOButtons() {
        // JRadioButtons love being held in JPanels that use GridLayout
        JPanel radioPanel = new JPanel(new GridLayout(1, 0));
        radioPanel.setBorder(BorderFactory.createTitledBorder("Week Days"));
        for (String radioText : RADIO_TEXTS) {
            JRadioButton radioButton = new JRadioButton(radioText); // create radiobtn
            radioButton.setActionCommand(radioText); // set its action command text
            weekDayBtnGroup.add(radioButton); // add to ButtonGroup
            radioPanel.add(radioButton);   // add to a GridLayout-using JPanel
        }

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new AbstractAction("Show Selection") {

            @Override
            public void actionPerformed(ActionEvent evt) {
                ButtonModel model = weekDayBtnGroup.getSelection();
                if (model != null) {
                    // if something is selected
                    System.out.println(model.getActionCommand());
                } else {
                    System.out.println("No weekday selected");
                }
            }
        }));
        buttonPanel.add(new JButton(new AbstractAction("Clear Selection") {

            @Override
            public void actionPerformed(ActionEvent e) {
                weekDayBtnGroup.clearSelection();
            }
        }));

        setLayout(new BorderLayout());
        add(radioPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        BunchOButtons mainPanel = new BunchOButtons();

        JFrame frame = new JFrame("BunchOButtons");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

通常,JRadioButton被分组在ButtonGroup对象中,ButtonGroup对象是一个逻辑对象,一次只允许选择一个JRadioButton。您要做的是在此ButtonGroup对象上调用
clearSelection()

另一方面,您似乎在GUI中使用
null
布局。虽然空布局和
setBounds()
可能会像创建复杂GUI的最简单和最好的方式一样吸引新手,但您创建的GUI越多,在使用它们时遇到的困难就越严重。当GUI调整大小时,它们不会调整您的组件的大小,它们是一个需要增强或维护的皇家女巫,当它们放置在滚动窗格中时会完全失败,当在所有平台或屏幕分辨率与原始分辨率不同的情况下查看时,它们看起来非常糟糕

比如说

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class BunchOButtons extends JPanel {
    private static final String[] RADIO_TEXTS = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
    private ButtonGroup weekDayBtnGroup = new ButtonGroup();

    public BunchOButtons() {
        // JRadioButtons love being held in JPanels that use GridLayout
        JPanel radioPanel = new JPanel(new GridLayout(1, 0));
        radioPanel.setBorder(BorderFactory.createTitledBorder("Week Days"));
        for (String radioText : RADIO_TEXTS) {
            JRadioButton radioButton = new JRadioButton(radioText); // create radiobtn
            radioButton.setActionCommand(radioText); // set its action command text
            weekDayBtnGroup.add(radioButton); // add to ButtonGroup
            radioPanel.add(radioButton);   // add to a GridLayout-using JPanel
        }

        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JButton(new AbstractAction("Show Selection") {

            @Override
            public void actionPerformed(ActionEvent evt) {
                ButtonModel model = weekDayBtnGroup.getSelection();
                if (model != null) {
                    // if something is selected
                    System.out.println(model.getActionCommand());
                } else {
                    System.out.println("No weekday selected");
                }
            }
        }));
        buttonPanel.add(new JButton(new AbstractAction("Clear Selection") {

            @Override
            public void actionPerformed(ActionEvent e) {
                weekDayBtnGroup.clearSelection();
            }
        }));

        setLayout(new BorderLayout());
        add(radioPanel, BorderLayout.CENTER);
        add(buttonPanel, BorderLayout.PAGE_END);
    }

    private static void createAndShowGui() {
        BunchOButtons mainPanel = new BunchOButtons();

        JFrame frame = new JFrame("BunchOButtons");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

由于您的
JFrame
可能包含许多任意嵌套在框架布局中的
JRadioButton
组件,因此您可能需要使用递归方式向下递归组件层次结构,并检查每个组件是否是
JRadioButton
的实例,在这种情况下,您应该强制转换并
。setSelected(false)
它,或
容器
,在这种情况下,您应该继续递归。要获取
JFrame
的顶级容器,请使用
JFrame.getContentPane

用一个简单的例子(包含OP要求的
Clean
方法的实现)来说明这种方法:


当然,正如其他人所建议的,您很可能希望将单选按钮选择状态的管理分配给
ButtonGroup
,并使用
ButtonGroup.clearSelection
方法取消所有选择(上述方法不适用于
ButtonGroup
中的单选按钮).

由于您的
JFrame
可能包含许多任意嵌套在框架布局中的
JRadioButton
组件,因此您可能需要使用递归方式向下递归组件层次结构,并检查每个组件是否是
JRadioButton
的实例,在这种情况下,您应该强制转换并
。setSelected(false)
它,或
容器
,在这种情况下,您应该继续递归。要获取
JFrame
的顶级容器,请使用
JFrame.getContentPane

用一个简单的例子(包含OP要求的
Clean
方法的实现)来说明这种方法:


当然,正如其他人所建议的,您很可能希望将单选按钮选择状态的管理分配给
ButtonGroup
,并使用
ButtonGroup.clearSelection
方法取消所有选择(上述方法不适用于
ButtonGroup
中的单选按钮).

我没有在Components中找到ButtonGroup对象,在哪里可以找到他?PS:我是JFrame新手,我正在学习编程课程,但我们在JOptionPane中只使用Java。@Novatec javax.swingx。ButtonGroup@Novatec:如Mad所述--在API中查找ButtonGroup。还有一个Google on
Java按钮组教程
first hit:。再看看上面的代码示例,我没有在Components中找到ButtonGroup对象,在哪里可以找到他?PS:我是JFrame新手,我正在学习编程课程,但我们在JOptionPane中只使用Java。@Novatec javax.swingx。ButtonGroup@Novatec:如Mad所述--在API中查找ButtonGroup。还有一个Google on
Java按钮组教程
first hit:。还要看上面的代码示例。BurptinGroup不是组件或容器,也不是添加到UI中的。相反,它管理着一组我不好的按钮。我的意思是检查每个组件是否是
JRadioButton
,然后用
.setSelected(false)
取消选择。但是,只有当
JRadioButton
组件不在任何
按钮组中时,这才有效。谢谢你的代码对我帮助很大,我只是需要它,不创建ButtonGroup.BurptinGroup不是组件或容器,也不会添加到UI中。相反,它管理着一组我不好的按钮。我的意思是检查每个组件是否是一个
JRadioButton
,并用
.setSelected(false)
取消选择它。然而,只有当
JRadioButton
组件不在任何
按钮组中时,这才有效。谢谢你的代码对我帮助很大,我只是需要它,而不是制作按钮组。