如何获取从 ButtonGroup 中选择的 JRadioButton

Posted

技术标签:

【中文标题】如何获取从 ButtonGroup 中选择的 JRadioButton【英文标题】:How do I get which JRadioButton is selected from a ButtonGroup 【发布时间】:2010-09-17 02:36:12 【问题描述】:

我有一个在表单上包含单选按钮的摇摆应用程序。我有ButtonGroup,但是,查看可用的方法,我似乎无法获得所选JRadioButton 的名称。到目前为止,这是我能说的:

从 ButtonGroup,我可以执行 getSelection() 以返回 ButtonModel。从那里,我可以执行getActionCommand,但这似乎并不总是有效。我尝试了不同的测试并得到了不可预测的结果。

同样来自ButtonGroup,我可以从getElements() 获得一个枚举。但是,我将不得不遍历每个按钮来检查它是否是被选中的。

有没有更简单的方法来找出哪个按钮被选中了?我正在使用 Java 1.3.1 和 Swing 进行编程。

【问题讨论】:

Java 1.3.1?仅在老式 Solaris 8 上受支持,并且从 4 月起没有错误? 是的,我知道。我正在为其开发此版本的台式机具有仍在此版本上运行的旧应用程序,我不想弄乱它。 【参考方案1】:

我遇到了类似的问题并解决了这个问题:

import java.util.Enumeration;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;

public class GroupButtonUtils 

    public String getSelectedButtonText(ButtonGroup buttonGroup) 
        for (Enumeration<AbstractButton> buttons = buttonGroup.getElements(); buttons.hasMoreElements();) 
            AbstractButton button = buttons.nextElement();

            if (button.isSelected()) 
                return button.getText();
            
        

        return null;
    

它返回所选按钮的文本。

【讨论】:

我认为您应该只发布该方法“getSelectedButtonText”作为答案。完美答案! 很好的解决方案,获取选定按钮的文本 - 但应该知道,当按钮重命名时(例如,翻译时)输出会发生变化。不鼓励将任何功能绑定到 GUI 中显示的文本。【参考方案2】:

我会遍历您的JRadioButtons 并致电isSelected()。如果您真的想从ButtonGroup 出发,您只能访问模型。您可以将模型与按钮匹配,但是如果您可以访问按钮,为什么不直接使用它们呢?

【讨论】:

请考虑以下阅读:javaworld.com/article/2077509/core-java/… @Thufir : ButtonGroup 告诉 Java 只应选择组的 JRadioButtons 中的一个。没有它,所有这些都可以同时选择。【参考方案3】:

您必须将setActionCommand 添加到JRadioButton 然后这样做:

String entree = entreeGroup.getSelection().getActionCommand();

示例:

java = new JRadioButton("Java");
java.setActionCommand("Java");
c = new JRadioButton("C/C++");
c.setActionCommand("c");
System.out.println("Selected Radio Button: " + 
                    buttonGroup.getSelection().getActionCommand());

【讨论】:

【参考方案4】:

我建议直接使用 Swing 中的模型方法。将组件放入面板和布局管理器后,甚至不必费心保留对它的特定引用。

如果你真的想要这个小部件,那么你可以使用isSelected 测试每个小部件,或者维护一个Map&lt;ButtonModel,JRadioButton&gt;

【讨论】:

【参考方案5】:

您可以将 actionCommand 放到每个单选按钮(字符串)中。

this.jButton1.setActionCommand("dog");
this.jButton2.setActionCommand("cat");
this.jButton3.setActionCommand("bird");

假设它们已经在一个 ButtonGroup 中(在这种情况下为 state_group),您可以像这样获取选定的单选按钮:

String selection = this.state_group.getSelection().getActionCommand();

希望对你有帮助

【讨论】:

【参考方案6】:

以下代码显示在单击按钮时从 Buttongroup 中选择了哪个 JRadiobutton。 它是通过循环访问特定按钮组中的所有 JRadioButtons 来完成的。

 JRadioButton firstRadioButton=new JRadioButton("Female",true);  
 JRadioButton secondRadioButton=new JRadioButton("Male");  

 //Create a radio button group using ButtonGroup  
 ButtonGroup btngroup=new ButtonGroup();  

 btngroup.add(firstRadioButton);  
 btngroup.add(secondRadioButton);  

 //Create a button with text ( What i select )  
 JButton button=new JButton("What i select");  

 //Add action listener to created button  
 button.addActionListener(this);  

 //Get selected JRadioButton from ButtonGroup  
  public void actionPerformed(ActionEvent event)  
    
     if(event.getSource()==button)  
       
        Enumeration<AbstractButton> allRadioButton=btngroup.getElements();  
        while(allRadioButton.hasMoreElements())  
          
           JRadioButton temp=(JRadioButton)allRadioButton.nextElement();  
           if(temp.isSelected())  
             
            JOptionPane.showMessageDialog(null,"You select : "+temp.getText());  
             
                    
     
  

【讨论】:

hmm ...这与之前的答案不同...?【参考方案7】:

通常,需要一些与所选单选按钮关联的对象。它不一定是代表按钮标签的String。它可能是一个包含按钮索引的Integer,或者是一个更复杂类型的对象T。您可以按照Tom Hawtin 的建议填写并使用Map&lt;ButtonModel, T&gt;,但我建议扩展模型并将对象放置在那里。这是使用这种方法的改进的ButtonGroup

import javax.swing.*;

@SuppressWarnings("serial")
public class SmartButtonGroup<T> extends ButtonGroup 
    @Override
    public void add(AbstractButton b) 
        throw new UnsupportedOperationException("No object supplied");
    

    public void add(JRadioButton button, T attachedObject) 
        ExtendedModel<T> model = new ExtendedModel<>(attachedObject);
        model.setSelected(button.isSelected());
        button.setModel(model);
        super.add(button);
    

    @SuppressWarnings("unchecked")
    public T getSelectedObject() 
        ButtonModel selModel = getSelection();
        return selModel != null ? ((ExtendedModel<T>)selModel).obj : null;
    

    public static class ExtendedModel<T> extends javax.swing.JToggleButton.ToggleButtonModel 
        public T obj;

        private ExtendedModel(T object) 
            obj = object;
        
    

您可以使用此实用程序类代替ButtonGroup。创建此类的对象并向其添加按钮以及相关对象。例如,

SmartButtonGroup<Integer> group = new SmartButtonGroup<>();
JPanel panel = new JPanel();

for (int i = 1; i <= 5; i++) 
    JRadioButton button = new JRadioButton("Button #" + i, i == 3); // select the 3rd button
    group.add(button, i);
    panel.add(button);

在此之后,您可以随时通过简单地调用getSelectedObject() 来获取与当前选定按钮关联的对象,如下所示:

int selectedButtonIndex = group.getSelectedObject();

如果您只需要按钮本身,则可以使用下一个非泛型类。

import javax.swing.JRadioButton;

@SuppressWarnings("serial")
public class RadioButtonGroup extends SmartButtonGroup<JRadioButton> 
    public void add(JRadioButton button) 
        super.add(button, button);
    

    @Override
    public void add(JRadioButton button, JRadioButton attachedObject) 
        throw new UnsupportedOperationException("Use the short form of addition instead");
    

    public JRadioButton getSelectedButton() 
        return getSelectedObject();
    

【讨论】:

【参考方案8】:

您可以使用 ItemSelectable(ButtonModel 的超接口)的 getSelectedObjects(),它返回所选项目的列表。在单选按钮组的情况下,它只能是一个或根本没有。

【讨论】:

我试过了,但我得到了一个 NPE。我做了一点研究,发现:java.sun.com/javase/6/docs/api/javax/swing/… 由于 JRadioButton 的按钮模型是 JToggleButton.ToggleButtonModel,所以它总是会返回 null。【参考方案9】:

然后将单选按钮添加到按钮组:

buttonGroup.getSelection().getActionCommand

【讨论】:

不回答问题(这是为了获取选定的 JRadioButton 与其 actionCommand)【参考方案10】:
import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;

public class RadioButton extends JRadioButton 

    public class RadioButtonModel extends JToggleButton.ToggleButtonModel 
        public Object[] getSelectedObjects() 
            if ( isSelected() ) 
                return new Object[]  RadioButton.this ;
             else 
                return new Object[0];
            
        

        public RadioButton getButton()  return RadioButton.this; 
    

    public RadioButton()  super(); setModel(new RadioButtonModel()); 
    public RadioButton(Action action)  super(action); setModel(new RadioButtonModel()); 
    public RadioButton(Icon icon)  super(icon); setModel(new RadioButtonModel()); 
    public RadioButton(String text)  super(text); setModel(new RadioButtonModel()); 
    public RadioButton(Icon icon, boolean selected)  super(icon, selected); setModel(new RadioButtonModel()); 
    public RadioButton(String text, boolean selected)  super(text, selected); setModel(new RadioButtonModel()); 
    public RadioButton(String text, Icon icon)  super(text, icon); setModel(new RadioButtonModel()); 
    public RadioButton(String text, Icon icon, boolean selected)  super(text, icon, selected); setModel(new RadioButtonModel()); 

    public static void main(String[] args) 
        RadioButton b1 = new RadioButton("A");
        RadioButton b2 = new RadioButton("B");
        ButtonGroup group = new ButtonGroup();
        group.add(b1);
        group.add(b2);
        b2.setSelected(true);
        RadioButtonModel model = (RadioButtonModel)group.getSelection();
        System.out.println(model.getButton().getText());
    

【讨论】:

【参考方案11】:

使用isSelected() 方法。它会告诉您 radioButton 的状态。将它与循环(比如 for 循环)结合使用,您可以找到选择了哪一个。

【讨论】:

【参考方案12】:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 
public class MyJRadioButton extends JFrame implements ActionListener

    JRadioButton rb1,rb2;  //components
    ButtonGroup bg;
    MyJRadioButton()

    setLayout(new FlowLayout());
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    rb1=new JRadioButton("male");
    rb2=new JRadioButton("female");

    //add radio button to button group
    bg=new ButtonGroup();
    bg.add(rb1);
    bg.add(rb2);

    //add radio buttons to frame,not button group
    add(rb1);
    add(rb2);
    //add action listener to JRadioButton, not ButtonGroup
    rb1.addActionListener(this);
    rb2.addActionListener(this);
    pack();
    setVisible(true);

public static void main(String[] args)

    new MyJRadioButton(); //calling constructor

@Override
public void actionPerformed(ActionEvent e) 

    System.out.println(((JRadioButton) e.getSource()).getActionCommand());

【讨论】:

虽然这个 sn-p 可以回答问题,但最好解释一下如何它解决了 OP 问题【参考方案13】:

Ale Rojas 的回答很好:

作为替代方案,您也可以在您的 JButton 上使用 My_JRadiobutton11.addActionListener(this);,然后在 actionPerformed 函数中像这样执行您的操作(它只是使用您必须实例化的额外变量(例如私有字符串选择;)但它不是大不了):

public void actionPerformed(ActionEvent arg0) 
      if(arg0.getSource() == My_JRadiobutton11)
          //my selection
          selection = "Become a dolphin";
      else if(arg0.getSource() == My_JRadiobutton12)
          //my selection
          selection = "Become a Unicorn";
       ..etc 
 

【讨论】:

【参考方案14】:
jRadioOne = new javax.swing.JRadioButton();
jRadioTwo = new javax.swing.JRadioButton();
jRadioThree = new javax.swing.JRadioButton();

...然后对于每个按钮:

buttonGroup1.add(jRadioOne);
jRadioOne.setText("One");
jRadioOne.setActionCommand(ONE);
jRadioOne.addActionListener(radioButtonActionListener);

...听众

ActionListener radioButtonActionListener = new java.awt.event.ActionListener() 
            public void actionPerformed(java.awt.event.ActionEvent evt) 
                radioButtonActionPerformed(evt);
            
        ;

...做任何你需要的事情来响应事件

protected void radioButtonActionPerformed(ActionEvent evt)             
       System.out.println(evt.getActionCommand());
    

【讨论】:

这会混淆输入事件和状态变化。其他代码可能会改变状态。它还减轻了按钮组模型的责任。

以上是关于如何获取从 ButtonGroup 中选择的 JRadioButton的主要内容,如果未能解决你的问题,请参考以下文章

QT ButtonGroup 和可检查的 PushButtons:如何将切换信号与 int 和 bool 连接?

如何修复每个 <List> 项中的 ButtonGroup 组件 [关闭]

如何在 Java 中创建带有连接按钮的 ButtonGroup?

PyQt中对RadioButton分组

如何为 ButtonGroup 内的 MUI 按钮设置悬停行为

如何在 Java 中使用 Button Group Swing 控件?