81 votes

Comment puis-je savoir quel bouton JRadioButton est sélectionné dans un groupe de boutons ?

J'ai une application swing qui comprend des boutons radio sur un formulaire. J'ai le ButtonGroup Cependant, en examinant les méthodes disponibles, je ne parviens pas à obtenir le nom de l'élément sélectionné. JRadioButton . Voici ce que je peux dire jusqu'à présent :

  • À partir de ButtonGroup, je peux effectuer un getSelection() pour renvoyer le ButtonModel . A partir de là, je peux effectuer un getActionCommand mais cela ne semble pas toujours fonctionner. J'ai essayé différents tests et obtenu des résultats imprévisibles.

  • Également de ButtonGroup je peux obtenir une énumération à partir de getElements() . Cependant, je devrais alors parcourir en boucle chaque bouton pour vérifier s'il s'agit bien du bouton sélectionné.

Existe-t-il un moyen plus simple de savoir quel bouton a été sélectionné ? Je programme ceci en Java 1.3.1 et Swing.

0 votes

Java 1.3.1 ? C'est-à-dire qu'il n'est supporté que sur le vieux Solaris 8, et qu'il n'y a plus de bogues depuis avril ?

0 votes

Oui, je sais. Les ordinateurs de bureau pour lesquels je développe ce programme ont des applications plus anciennes qui fonctionnent encore avec cette version, et je ne veux pas les perturber.

79voto

Rendicahya Points 953

J'ai eu un problème similaire et je l'ai résolu avec ceci :

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

Il renvoie le texte du bouton sélectionné.

0 votes

Je pense que vous devriez simplement poster la méthode 'getSelectedButtonText' comme réponse. Réponse parfaite !

4 votes

Belle solution pour obtenir le texte d'un bouton sélectionné - MAIS il faut savoir que la sortie change lorsque le bouton est renommé (par exemple lorsqu'il est traduit). Il est plutôt déconseillé de lier une fonctionnalité au texte affiché dans l'interface graphique.

42voto

Draemon Points 15448

Je voudrais juste faire une boucle dans votre JRadioButtons et appeler isSelected() . Si vous voulez vraiment passer de la ButtonGroup vous pouvez seulement accéder aux modèles. Vous pourriez associer les modèles aux boutons, mais si vous avez accès aux boutons, pourquoi ne pas les utiliser directement ?

1 votes

S s'il vous s'il vous s'agit de cette lecture : javaworld.com/article/2077509/core-java/

5 votes

@Thufir : ButtonGroup indique à Java que seul un des JRadioButtons du groupe doit être sélectionné. Sans cela, ils pourraient tous être sélectionnés simultanément.

5voto

Je suggère d'opter directement pour l'approche par modèle dans Swing. Une fois que vous avez placé le composant dans le panneau et le gestionnaire de disposition, ne prenez même pas la peine de conserver une référence spécifique à celui-ci.

Si vous voulez vraiment le widget, alors vous pouvez tester chacun d'eux avec isSelected ou de maintenir un Map<ButtonModel,JRadioButton> .

2voto

Akki Points 104

Le code suivant affiche quel JRadiobutton est choisi parmi les groupes de boutons. en cliquant sur un bouton.
Cela se fait en parcourant en boucle tous les JRadioButtons d'un buttonGroup particulier.

 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 votes

Hmm ... cela diffère des réponses précédentes en ce que ... ?

0voto

Daniel Rikowski Points 27193

Vous pourriez utiliser getSelectedObjects() de ItemSelectable (superinterface de ButtonModel) qui renvoie la liste des éléments sélectionnés. Dans le cas d'un groupe de boutons radio, il ne peut y en avoir qu'un seul ou aucun.

2 votes

J'ai essayé, mais j'ai obtenu un NPE. J'ai fait une petite recherche, et j'ai trouvé ceci : [java.sun.com/javase/6/docs/api/javax/swing/](http://java.sun.com/javase/6/docs/api/javax/swing/DefaultButtonModel.html#getSelectedObjects()) Comme le modèle de bouton de JRadioButton est JToggleButton.ToggleButtonModel, il renvoie toujours null.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X