我如何从ButtonGroup中选择哪个JRadioButton


77

我有一个包含窗体上的单选按钮的swing应用程序。我有ButtonGroup但是,望着可用的方法,我似乎不能得到所选择的名称JRadioButton。到目前为止,我可以说的是:

  • 在ButtonGroup中,我可以执行getSelection()来返回ButtonModel。从那里,我可以执行getActionCommand,但似乎并不总是可行。我尝试了不同的测试,但结果却无法预测。

  • 另外ButtonGroup,我可以从中获取枚举getElements()。但是,然后我将不得不遍历每个按钮,只是检查并查看它是否被选中。

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


Java 1.3.1?就像仅在老式Solaris 8上受支持的那样,并且从4月起没有bug?
汤姆·霍顿

是的,我知道。我正在为此开发的台式机具有仍在该版本上运行的较旧的应用程序,我不想对此感到困惑。
乔尔

Answers:


41

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



5
@Thufir:ButtonGroup告诉Java仅应选择该组的JRadioButtons中的一个。没有这些,可以同时选择所有这些对象。
Makan Tayebi 2014年

75

我有类似的问题,并解决了这个问题:

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”作为答案。完美答案!
Petro 2014年

4
不错的解决方案,获取选定按钮的文本-但是,应该知道重命名按钮时(例如,翻译时)输出会更改。不建议将任何功能绑定到GUI中显示的文本。
GameDroids 2015年

32

您必须添加setActionCommandJRadioButton,然后就去做:

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());

5

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

如果您确实需要该小部件,则可以使用进行测试isSelected,或维护一个Map<ButtonModel,JRadioButton>


4

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

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

假设它们已经在ButtonGroup(在本例中为state_group)中,则可以像下面这样获得所选的单选按钮:

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

希望这可以帮助


2

以下代码显示单击按钮后从Buttongroup中选择了哪个JRadiobutton
通过循环遍历特定buttonGroup中的所有JRadioButton来完成。

 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());  
           }  
        }            
     }
  }

2
嗯...这与以前的答案不同..?
kleopatra 2013年


0

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

buttonGroup.getSelection()。getActionCommand


不回答问题(这是为了获取所选的JRadioButton与它的actionCommand)
kleopatra 2013年

0
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());
    }
}

0

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


0
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());
}

}


1
尽管此代码段可以回答问题,但更好地解释如何解决OP问题
让·吉恩

0

通常,需要与所选单选按钮关联的某些对象。它不一定String代表按钮的标签。它可以是Integer包含按钮的索引的对象,也可以是更复杂类型的对象T。您可以Map<ButtonModel, T>按照Tom Hawtin的建议填充和使用,但是我建议扩展模型并将对象放置在那里。这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();
    }
}

-3
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());
    }

2
这会混淆输入事件和状态更改。其他代码可能会更改状态。它还使按钮组模型承担了责任。
汤姆·哈特芬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.