91 Stimmen

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

Ich habe eine Swing-Anwendung, die Optionsfelder in einem Formular enthält. Ich habe die ButtonGroup Wenn ich mir jedoch die verfügbaren Methoden ansehe, kann ich den Namen der ausgewählten Methode nicht herausfinden. JRadioButton . Hier ist, was ich bis jetzt sagen kann:

  • Von ButtonGroup aus kann ich eine getSelection() zur Rückgabe der ButtonModel . Von dort aus kann ich eine getActionCommand aber das scheint nicht immer zu funktionieren. Ich habe verschiedene Tests ausprobiert und unvorhersehbare Ergebnisse erhalten.

  • Auch von ButtonGroup kann ich eine Aufzählung von getElements() . Allerdings müsste ich dann jede Schaltfläche in einer Schleife durchlaufen, um zu prüfen, ob sie ausgewählt ist.

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

3voto

Akki Punkte 1201

Der folgende Code zeigt an, welche JRadiobutton wird aus Buttongroup ausgewählt auf Knopfdruck.
Dazu werden alle JRadioButtons einer bestimmten buttonGroup in einer Schleife durchlaufen.

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

1voto

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

1voto

John McClane Punkte 3338

In der Regel ist ein Objekt erforderlich, das mit dem ausgewählten Optionsfeld verbunden ist. Es ist nicht unbedingt ein String die die Beschriftung der Schaltfläche darstellt. Es könnte ein Integer mit dem Index der Schaltfläche oder ein Objekt von komplizierterem Typ T . Sie können eine Map<ButtonModel, T> als Tom Hawtin vorgeschlagen, aber ich schlage vor, das Modell zu erweitern und die Objekte dort zu platzieren. Hier ist eine verbesserte ButtonGroup die diesen Ansatz verfolgt.

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 Hilfsklasse anstelle von ButtonGroup . Erstellen Sie ein Objekt dieser Klasse und fügen Sie ihm Schaltflächen mit den zugehörigen Objekten 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 mit der aktuell ausgewählten Schaltfläche verbunden ist, jederzeit abrufen, indem Sie einfach getSelectedObject() etwa so:

int selectedButtonIndex = group.getSelectedObject();

Für den Fall, dass 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();
    }
}

0voto

Daniel Rikowski Punkte 68643

Sie könnten getSelectedObjects() von ItemSelectable (Superinterface von ButtonModel) verwenden, das die Liste der ausgewählten Elemente zurückgibt. Im Falle einer Optionsschaltflächengruppe kann es nur eines oder gar keines sein.

0voto

Spoonaroony Punkte 71

Fügen Sie dann die Radiobuttons zu einer Buttongruppe hinzu:

buttonGroup.getSelection().getActionCommand

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X