Как узнать, какой JRadioButton выбран из ButtonGroup

У меня есть приложение Swing, которое включает в себя радио кнопки на форме. у меня есть ButtonGroupОднако, глядя на доступные методы, я не могу получить название выбранного JRadioButton, Вот что я могу сказать до сих пор:

  • Из ButtonGroup я могу выполнить getSelection() вернуть ButtonModel, Оттуда я могу выполнить getActionCommand, но это не всегда работает. Я пробовал разные тесты и получил непредсказуемые результаты.

  • Также из ButtonGroupЯ могу получить Перечень от getElements(), Тем не менее, тогда я должен был бы пройтись по каждой кнопке, чтобы проверить, не выбрана ли она.

Есть ли более простой способ узнать, какая кнопка была выбрана? Я программирую это в Java 1.3.1 и Swing.

14 ответов

Решение

Я бы просто перебрал ваш JRadioButtons и позвонить isSelected(), Если вы действительно хотите перейти от ButtonGroup Вы можете добраться только до моделей. Вы можете сопоставить модели с кнопками, но если у вас есть доступ к кнопкам, почему бы не использовать их напрямую?

Я получил похожую проблему и решил с этим:

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

Возвращает текст выбранной кнопки.

Вы должны добавить 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());

Вы можете поставить и actionCommand для каждой радиокнопки (строки).

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

Предполагая, что они уже находятся в ButtonGroup (в данном случае state_group), вы можете получить выбранный переключатель следующим образом:

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

Надеюсь это поможет

Я предлагаю перейти прямо к модельному подходу в Swing. После того, как вы поместили компонент в диспетчер панелей и макетов, даже не беспокойтесь о сохранении конкретной ссылки на него.

Если вы действительно хотите, чтобы виджет, то вы можете проверить каждый с isSelectedили поддерживать Map<ButtonModel,JRadioButton>,

Следующий код показывает, какая 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());  
           }  
        }            
     }
  }
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());
    }
}

Обычно требуется какой-то объект, связанный с выбранной радиокнопкой. Это не обязательноStringпредставляющий метку кнопки. Это могло бытьInteger содержащий индекс кнопки или объект более сложного типа T. Вы можете заполнить и использоватьMap<ButtonModel, T>как предложил Том Хотин, но я предлагаю расширить модель и разместить там объекты. Вот улучшенный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();
    }
}

Ответ Але Рохаса отлично работает:

В качестве альтернативы вы также можете использовать на вашем JButton, а затем выполните свои действия в функции 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 
 }

Добавьте радиокнопки в группу кнопок, затем:

buttonGroup.getSelection (). getActionCommand

Вы можете использовать getSelectedObjects() для ItemSelectable (суперинтерфейс ButtonModel), который возвращает список выбранных элементов. В случае группы переключателей это может быть только один или ни одного вообще.

Использовать isSelected() метод. Он скажет вам состояние вашего радио кнопки. Используя его в сочетании с циклом (скажем, для цикла), вы можете найти, какой из них был выбран.

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

}

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());
    }
Другие вопросы по тегам