【问题标题】:How do I get which JRadioButton is selected from a ButtonGroup如何获取从 ButtonGroup 中选择的 JRadioButton
【发布时间】: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 月起没有错误?
  • 是的,我知道。我正在为其开发此版本的台式机具有仍在此版本上运行的旧应用程序,我不想弄乱它。

标签: java swing


【解决方案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 出发,您只能访问模型。您可以将模型与按钮匹配,但是如果您可以访问按钮,为什么不直接使用它们呢?

【讨论】:

【解决方案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());
                    }
                

                【讨论】:

                • 这会混淆输入事件和状态变化。其他代码可能会改变状态。它还减轻了按钮组模型的责任。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2017-05-09
                • 2015-06-15
                • 1970-01-01
                • 2020-04-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多