Як отримати, який JRadioButton вибрано з ButtonGroup


77

У мене є програма swing, яка включає перемикачі на бланку. У мене є ButtonGroup, однак, дивлячись на доступні методи, я не можу зрозуміти назву вибраного JRadioButton. Ось що я можу сказати поки:

  • За допомогою ButtonGroup я можу виконати a getSelection()для повернення ButtonModel. Звідти я можу виконати getActionCommand, але це, здається, не завжди працює. Я спробував різні тести і отримав непередбачувані результати.

  • Також від ButtonGroup, я можу отримати Перелік від getElements(). Однак тоді мені довелося б прокрутити кожну кнопку, лише щоб перевірити, чи не обрана вона.

Чи є простіший спосіб дізнатись, яку кнопку було обрано? Я програмую це на Java 1.3.1 та Swing.


Java 1.3.1? Як у тому, що підтримується лише на старовинному Solaris 8, і з квітня немає помилок?
Том Хоутін - таклін

Так, я знаю. Настільні машини, для яких я розробляю це, мають старі програми, які все ще працюють на цій версії, і я не хочу з цим возитися.
Джоел

Відповіді:


41

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


1
будь ласка, розгляньте це читання: javaworld.com/article/2077509/core-java/…
Віктор

5
@Thufir: ButtonGroup повідомляє Java, що слід вибрати лише одну з JRadioButtons групи. без цього всі вони могли бути обрані одночасно.
Makan Tayebi

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' як відповідь. Ідеальна відповідь!
Петро

4
Приємне рішення - отримати текст обраної кнопки - АЛЕ слід пам’ятати, що вихідні дані змінюються при перейменуванні кнопки (наприклад, при перекладі). Прив'язувати будь-яку функціональність до тексту, що відображається в графічному інтерфейсі, не рекомендується.
GameDroids

32

Ви повинні додати 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());

5

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

Якщо ви дійсно хочете віджет, тоді ви можете протестувати кожен за допомогою isSelectedабо підтримати Map<ButtonModel,JRadioButton>.


4

Ви можете поставити і actionCommand до кожного перемикача (рядка).

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

Припускаючи, що вони вже перебувають у ButtonGroup (у цьому випадку - state_group), ви можете отримати вибраний перемикач таким чином:

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

Сподіваюся, це допомагає


2

Наступний код відображає, яку кнопку JRadiobutton вибрано з Buttongroup натисканням кнопки.
Це робиться шляхом перегляду всіх 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());  
           }  
        }            
     }
  }

2
хм ... це відрізняється від попередніх відповідей тим, що ..?
kleopatra

0

Ви можете використовувати getSelectedObjects () з ItemSelectable (суперінтерфейс ButtonModel), який повертає список вибраних елементів. У випадку групи перемикачів це може бути лише один або взагалі жоден.


1
Я спробував, це, але я отримував NPE. Я зробив невелике дослідження і виявив: java.sun.com/javase/6/docs/api/javax/swing/… Оскільки модель кнопки JRadioButton є JToggleButton.ToggleButtonModel, вона завжди повертає нуль.
Джоел

0

Додайте перемикачі до групи кнопок:

buttonGroup.getSelection (). getActionCommand


не відповідаючи на запитання (яке мало отримати обраний JRadioButton проти його дії Command)
kleopatra

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()метод. Це покаже вам стан вашого радіокнопки. Використовуючи його в поєднанні з циклом (скажімо, для циклу), ви можете знайти, який із них був обраний.


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
jean

0

Як правило, потрібен якийсь об’єкт, пов’язаний із вибраним перемикачем. Це не обов'язково 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();
    }
}

-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
Це плутає вхідні події та зміни стану. Інший код може змінити стан. Це також знімає відповідальність з моделі групи кнопок.
Том Хоутін - таклін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.