Wie erhalte ich, welcher JRadioButton aus einer ButtonGroup ausgewählt ist?


75

Ich habe eine Swing-Anwendung, die Optionsfelder in einem Formular enthält. Ich habe ButtonGroupjedoch die verfügbaren Methoden betrachtet, ich kann nicht scheinen, den Namen der ausgewählten zu bekommen JRadioButton. Folgendes kann ich bisher sagen:

  • Von ButtonGroup aus kann ich ein ausführen getSelection(), um das zurückzugeben ButtonModel. Von dort aus kann ich eine durchführen getActionCommand, aber das scheint nicht immer zu funktionieren. Ich habe verschiedene Tests ausprobiert und unvorhersehbare Ergebnisse erzielt.

  • Auch von ButtonGroupkann ich eine Aufzählung bekommen getElements(). Dann müsste ich jedoch jede Schaltfläche durchlaufen, um zu überprüfen, ob es sich um die ausgewählte handelt.

Gibt es eine einfachere Möglichkeit herauszufinden, welche Schaltfläche ausgewählt wurde? Ich programmiere dies in Java 1.3.1 und Swing.


Java 1.3.1? Wie in nur auf Vintage Solaris 8 unterstützt, und keine Fehler ab April?
Tom Hawtin - Tackline

Ja ich weiß. Die Desktop-Computer, für die ich dies entwickle, haben ältere Anwendungen, die noch auf dieser Version ausgeführt werden, und damit möchte ich mich nicht anlegen.
Joel

Antworten:


41

Ich würde einfach Ihre durchlaufen JRadioButtonsund anrufen isSelected(). Wenn Sie wirklich von der gehen wollen, ButtonGroupkönnen Sie nur zu den Modellen gelangen. Sie könnten die Modelle den Tasten zuordnen, aber wenn Sie Zugriff auf die Tasten haben, warum nicht direkt verwenden?


1
Bitte beachten Sie diese Lesung: javaworld.com/article/2077509/core-java/…
Victor

5
@Thufir: ButtonGroup teilt Java mit, dass nur einer der JRadioButtons der Gruppe ausgewählt werden soll. ohne das könnten alle gleichzeitig ausgewählt werden.
Makan Tayebi

74

Ich habe ein ähnliches Problem und damit gelöst:

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

Es gibt den Text der ausgewählten Schaltfläche zurück.


Ich denke, Sie sollten einfach diese Methode 'getSelectedButtonText' als Antwort posten. Perfekte Antwort!
Petro

4
Gute Lösung, um den Text einer ausgewählten Schaltfläche zu erhalten - ABER man sollte sich bewusst sein, dass sich die Ausgabe ändert, wenn die Schaltfläche umbenannt wird (z. B. wenn sie übersetzt wird). Es wird eher davon abgeraten, Funktionen an den in der GUI angezeigten Text zu binden.
GameDroids

32

Sie müssen hinzufügen, setActionCommandum JRadioButtondann einfach zu tun:

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

Beispiel:

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

Ich schlage vor, in Swing direkt zum Modellansatz überzugehen. Nachdem Sie die Komponente in das Bedienfeld und den Layout-Manager eingefügt haben, müssen Sie nicht einmal einen bestimmten Verweis darauf behalten.

Wenn Sie das Widget wirklich wollen, können Sie es mit jedem testen isSelectedoder pflegen Map<ButtonModel,JRadioButton>.


4

Sie können jedem Optionsfeld (Zeichenfolge) einen Aktionsbefehl hinzufügen.

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

Angenommen, sie befinden sich bereits in einer ButtonGroup (in diesem Fall state_group), können Sie das ausgewählte Optionsfeld folgendermaßen abrufen:

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

Hoffe das hilft


2

Der folgende Code zeigt an, welcher JRadiobutton auf Knopfdruck aus Buttongroup ausgewählt wird .
Dies erfolgt durch Durchlaufen aller JRadioButtons in einer bestimmten buttonGroup.

 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
hmm ... das unterscheidet sich von früheren Antworten darin ..?
Kleopatra

0

Sie können getSelectedObjects () von ItemSelectable (Superinterface von ButtonModel) verwenden, das die Liste der ausgewählten Elemente zurückgibt. Bei einer Optionsfeldgruppe kann es sich nur um eine oder gar keine handeln.


1
Ich habe es versucht, aber ich bekam eine NPE. Ich habe ein wenig recherchiert und Folgendes gefunden: java.sun.com/javase/6/docs/api/javax/swing/… Da das Schaltflächenmodell von JRadioButton JToggleButton.ToggleButtonModel ist, wird immer null zurückgegeben.
Joel

0

Fügen Sie die Radiobuttons dann zu einer Schaltflächengruppe hinzu:

buttonGroup.getSelection (). getActionCommand


Beantwortung der Frage (die den ausgewählten JRadioButton gegen seinen Aktionsbefehl erhalten sollte)
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

Verwenden Sie die isSelected()Methode. Hier erfahren Sie den Status Ihres RadioButton. Wenn Sie es in Kombination mit einer Schleife (z. B. für Schleife) verwenden, können Sie herausfinden, welche ausgewählt wurde.


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
Während dieses Snippet die Frage beantworten kann, ist es besser zu erklären, wie es das OP-Problem löst
Jean

0

In der Regel ist ein Objekt erforderlich, das dem ausgewählten Optionsfeld zugeordnet ist. Es ist nicht unbedingt eine StringDarstellung der Beschriftung der Schaltfläche. Dies kann ein IntegerIndex der Schaltfläche oder ein Objekt eines komplizierteren Typs sein T. Sie könnten ein füllen und verwenden, Map<ButtonModel, T>wie von Tom Hawtin vorgeschlagen, aber ich schlage vor, das Modell zu erweitern und die Objekte dort zu platzieren. Hier ist eine Verbesserung ButtonGroup, die diesen Ansatz verwendet.

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

Sie können diese Dienstprogrammklasse anstelle von verwenden ButtonGroup. Erstellen Sie ein Objekt dieser Klasse und fügen Sie Schaltflächen sowie zugehörige Objekte hinzu. Zum Beispiel,

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

Danach können Sie das Objekt, das der aktuell ausgewählten Schaltfläche zugeordnet ist, jederzeit abrufen, indem Sie einfach Folgendes aufrufen getSelectedObject():

int selectedButtonIndex = group.getSelectedObject();

Wenn Sie nur die Schaltflächen selbst benötigen, können Sie stattdessen die nächste nicht generische Klasse verwenden.

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

... dann für jeden Knopf:

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

...Hörer

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

... tun, was Sie als Reaktion auf ein Ereignis benötigen

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

2
Das verwirrt Eingabeereignisse und Statusänderungen. Ein anderer Code kann den Status ändern. Es übernimmt auch die Verantwortung vom Schaltflächengruppenmodell.
Tom Hawtin - Tackline
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.