2008-10-14 15 views
57

Tengo una aplicación de swing que incluye botones de opción en un formulario. Tengo el ButtonGroup, sin embargo, mirando los métodos disponibles, parece que no puedo obtener el nombre del JRadioButton seleccionado. Esto es lo que puedo decir hasta ahora:Cómo obtengo qué JRadioButton se selecciona de un ButtonGroup

  • De ButtonGroup, puedo realizar una getSelection() para devolver el ButtonModel. A partir de ahí, puedo realizar un getActionCommand, pero eso no parece funcionar siempre. Intenté diferentes pruebas y obtuve resultados impredecibles.

  • También a partir de ButtonGroup, puedo obtener una enumeración de getElements(). Sin embargo, entonces tendría que pasar por cada botón solo para verificar y ver si es el seleccionado.

¿Hay alguna manera más fácil de saber qué botón se ha seleccionado? Estoy programando esto en Java 1.3.1 y Swing.

+0

Java 1.3.1? Como solo compatible con Solaris 8 vintage y sin errores de abril? –

+0

Sí, lo sé. Las máquinas de escritorio en las que estoy desarrollando esto tienen aplicaciones antiguas que todavía se ejecutan en esta versión, y no quiero meterme con eso. – Joel

Respuesta

36

Me gustaría simplemente recorrer su JRadioButtons y llamar al isSelected(). Si realmente quieres ir desde el ButtonGroup, solo puedes acceder a los modelos. Podría hacer coincidir los modelos con los botones, pero luego, si tiene acceso a los botones, ¿por qué no usarlos directamente?

+0

Parece que esta es la única forma, gracias. – Joel

+1

tenga en cuenta esta lectura: http://www.javaworld.com/article/2077509/core-java/java-tip-142--pushing-jbuttongroup.html – Victor

+2

¿Cuál podría ser el punto del grupo de botones, entonces? – Thufir

0

Puede usar getSelectedObjects() de ItemSelectable (superinterfaz de ButtonModel) que devuelve la lista de elementos seleccionados. En el caso de un grupo de botones de radio, solo puede ser uno o ninguno.

+1

Lo intenté, pero estaba obteniendo un NPE. Hice un poco de investigación y encontré esto: http://java.sun.com/javase/6/docs/api/javax/swing/DefaultButtonModel.html#getSelectedObjects() Desde modelo de botón de JRadioButton es JToggleButton.ToggleButtonModel , siempre devolverá nulo. – Joel

-3
jRadioOne = new javax.swing.JRadioButton(); 
jRadioTwo = new javax.swing.JRadioButton(); 
jRadioThree = new javax.swing.JRadioButton(); 

... entonces para cada botón:

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

... oyente

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

... hacer lo que tiene como respuesta al evento

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

Eso confunde eventos de entrada y cambios de estado. Otro código puede cambiar el estado. También quita la responsabilidad del modelo de grupo de botones. –

4

Sugiero ir directamente al enfoque de modelo en Swing. Después de colocar el componente en el panel y el administrador de disposición, no se moleste en mantener una referencia específica al mismo.

Si realmente desea el widget, puede probar cada uno con isSelected, o mantener un Map<ButtonModel,JRadioButton>.

64

Tengo un problema similar y resuelto con esto:

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

devuelve el texto del botón seleccionado.

+1

Me encanta hacer métodos personalizados para las tareas. Bien hecho. – tazboy

+1

Este método es EXACTAMENTE lo que necesitaba. ¡Te agradezco mucho! Ojalá pudiera darte 999 ups. –

+7

Esto probablemente debería estar en Java en primer lugar ... – mayhewsw

2

El siguiente código muestra qué JRadiobutton se selecciona de Buttongroup al hacer clic en un botón.
Se realiza al recorrer todos los JRadioButtons en un grupo de botones en particular.

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 ... ¿esto difiere de las respuestas anteriores en eso ...? – kleopatra

0

Añadir los botones de radio a un grupo de botones a continuación:

buttonGroup.getSelection().getActionCommand

+0

no respondiendo a la pregunta (que era obtener el _JRadioButton_ seleccionado vs. su actionCommand) – 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

Utilice el método isSelected(). Le dirá el estado de su radioButton. Utilizándolo en combinación con un bucle (digamos for loop) puede encontrar cuál ha sido seleccionado.

+0

¿No es esto lo mismo que la respuesta aceptada? –

20

Debe añadir setActionCommand a la JRadioButton a continuación, sólo hacer:

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

Ejemplo:

java = new JRadioButton("Java"); 
java.setActionCommand("Java"); 
c = new JRadioButton("C/C++"); 
c.setActionCommand("c"); 
System.out.println("Selected Radio Button: " + 
        buttonGroup.getSelection().getActionCommand()); 
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

Si bien este fragmento puede responder a la pregunta, es mejor explicar ** cómo ** resuelve el problema de OP. – jean

3

Se puede poner y actionCommand a cada botón de opción (cuerda).

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

Suponiendo que ya están en un ButtonGroup (state_group en este caso) se puede obtener en el botón de radio seleccionada como esto:

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

Esperanza esto ayuda

Cuestiones relacionadas