← (précédent) D.4 Evènements sur les cases à cocher
D.6 Evènements sur les champs de texte
Accueil S O M M A I R E

D.5 Evènements sur les boutons radio

Avant toute chose, sachez que le clic sur un bouton radio peut se réaliser de 2 façons différentes :
D' abord la façon classique : avec la souris, on clique sur le bouton radio.
Une autre façon consiste à sélectionner le bouton radio grâce à la touche tabulation (pointillés sur le bouton), puis on appui sur la barre d' espace du clavier. C' est le même effet.

L' évènement généré par le clic sur un bouton radio est traitée par la méthode (forcément prédéfinie) actionPerformed(). Ou par la méthode (forcément prédéfinie aussi) itemStateChanged(). Mais à la différence d' une case à cocher, les 2 évènements ne se produisent pas toujours simultanément.

Exeplications :

Sur une case à cocher, le fait de cliquer dessus génère l'évènement traité par la méthode actionPerformed(). Mais dans le même temps, l'évènement qui consiste en le changement de l'état de la case à cocher est généré. Ce dernier est traité par la méthode itemStateChanged().
On peut donc traiter le clic sur une case à cocher par l'une ou l'autre des 2 méthodes.

Pour ce qui est du bouton radio, ce n'est pas forcément le cas.

Imaginons 2 boutons radio : radio1 et radio2, appartenant au même groupe de boutons. Même groupe signifie qu'un seul bouton du groupe peut être sélectionné. Un seul à la fois.

Le clic sur radio1 est un évènement qui peut être traité par les 2 méthodes actionPerformed() et itemStateChanged(). Mais à une condition bien précise. Si le bouton radio1 est déjà sélectionné au moment où l'on clique dessus, alors seule la méthode actionPerformed() peut traitée l'évènement. La méthode itemStateChanged() ne peut pas traiter l'évènement généré par le clic sur le bouton. Pourquoi ? ... Parce que itemStateChanged() s'intéresse au changement de l'état du bouton. Or, cliquer sur un bouton déjà sélectionné ne génère par l'évènement traité par itemStateChanged().
En revanche, si le bouton n'était pas sélectionné avant que l'on clique dessus, alors, les 2 évènements sont générés : action sur le bouton et changement de l'état du bouton.


Quand on clique sur le bouton radio1 au moment où le bouton radio2 est sélectionné, on 3 évènements qui sont générés simultanément.
Explications :

Clic sur bouton radio1 (non sélectionné) : on a l'évènement action sur radio1 pouvant être traité par la méthode actionPerformed() et aussi l'évènement changement de l'état de radio1 pouvant être traité méthode itemStateChanged().
Dans le même temps, puisque radio2 était sélectionné, et que action sur radio1 délséectionne radio2, on a forcément l'évènement changement de l'état de radio2 qui est généré et qui peut être traité par la méthode itemStateChanged().

Ouf ! Je comprends que cela vous soit plus ou moins touffu. Mais reprenez la lecture si incompréhension il y a. Pas compliqué.

Trève d' explications. Allons-y pour les exemples.

 Exemple 1 : 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     import java.awt.event.*;
4.     
5.     class Fenetre extends JFrame implements ActionListener
6.     {
7.         private JRadioButton radio1, radio2; private JButton bouton;
8.          public Fenetre()
9.          {
10.              setTitle("Une fenetre dynamique");
11.              Container c = getContentPane();
12.              c.setBackground(new Color(208, 208, 255));
13.              setSize(500, 300);
14.              c.setLayout(new FlowLayout());
15.              
16.              ButtonGroup groupeDeBoutons = new ButtonGroup();
17.
18.              radio1 = new JRadioButton("RADIO 1");
19.              groupeDeBoutons.add(radio1);
20.              c.add(radio1);
21.            
22.              radio2 = new JRadioButton("RADIO 2");
23.              groupeDeBoutons.add(radio2);
24.              c.add(radio2);
25.
26.              setLocationRelativeTo(this.getParent()); 
27.              
28.              radio1.addActionListener(this);
29.              radio2.addActionListener(this);
30.              
31.              setDefaultCloseOperation(3);
32.          }
33.    
34.
34.          public void actionPerformed(ActionEvent a)
35.          {
36.               Object source = a.getSource();
37.               
38.              if(source == radio1)
39.              System.out.println("Action sur RADIO 1");               
40.              else
41.              System.out.println("Action sur RADIO 2");               
42.          }
43.    }
44.    
45.    public class TesterClicRadio
46.    {
47.         public static void main(String [] args)
48.         {
49.              Fenetre f = new Fenetre();
50.              f.setVisible(true);
51.         }
52.    }

Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre graphique contenant 2 boutons appelés : RADIO 1 et RADIO 2. Cliquez sur RADIO 1, il sera affiché : Action sur RADIO 1. Cliquez sur RADIO 2, il sera affiché RADIO 2.

Explications :

Un bouton radio n'a de sens que s'il n'est pas unique. Sinon, une case à cocher est à préférer. Et s'il y a plus d'un bouton radio, il est normal qu'il appartienne à un groupe de boutons de sorte que la sélection d'un bouton radio désactive le bouton préalablement sélectionné. D'où l'intérêt de créer un objet ButtonGroup (ligne 16).

Ligne 18 : on crée un bouton radio appelé RADIO 1. On l' ajoute au groupe(ligne 19). Puis on l'ajoute au conteneur c (ligne 20).

Même chose pour radio2 : lignes 22 à 24.

Ici, c'est l'objet Fenetre qui est écouteur puisque c'est sa classe qui implément l'interface ActionListener (ligne 5). C'est pourquoi la méthode actionPerformed() est redéfinie dans la classe Fenetre. Lignes 28 : on associe l'objet écouteur (this) à l'objet raiod1. Même chose pour l'objet radio2 en ligne 28

Dans la méthode actionPerforme(). La méthode getSource(), comme vous le savez déjà, retourne toujours un objet de type Object. Donc, tout objet, quelque soit sa classe, peut avoir pour référence, la variable source. Lignes 38 à 41 : Si cet objet est radio1, afficher l'expression : action sur RADIO 1. Sinon, afficher l'expression : action sur RADIO 2.
 Exemple 2 : 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     import java.awt.event.*;
4.     
5.     class Fenetre extends JFrame implements ItemListener
6.     {
7.         private JRadioButton radio1, radio2; private JButton bouton;
8.          public Fenetre()
9.          {
10.              setTitle("Une fenetre dynamique");
11.              Container c = getContentPane();
12.              c.setBackground(new Color(208, 208, 255));
13.              setSize(500, 300);
14.              c.setLayout(new FlowLayout());
15.              
16.              ButtonGroup groupeDeBoutons = new ButtonGroup();
17.
18.              radio1 = new JRadioButton("RADIO 1");
19.              groupeDeBoutons.add(radio1);
20.              c.add(radio1);
21.            
22.              radio2 = new JRadioButton("RADIO 2");
23.              groupeDeBoutons.add(radio2);
24.              c.add(radio2);
25.
26.              setLocationRelativeTo(this.getParent()); 
27.              
28.              radio1.addItemListener(this);
29.              radio2.addItemListener(this);
30.              
31.              setDefaultCloseOperation(3);
32.          }
33.    
34.
34.          public void itemStateChanged(ItemEvent i)
35.          {
36.               Object source = i.getSource();
37.               
38.              if(source == radio1)
39.              System.out.println("Action sur RADIO 1");               
40.              else
41.              System.out.println("Action sur RADIO 2");               
42.          }
43.    }
44.    
45.    public class TesterClicRadio2
46.    {
47.         public static void main(String [] args)
48.         {
49.              Fenetre f = new Fenetre();
50.              f.setVisible(true);
51.         }
52.    }

Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre graphique contenant 2 boutons appelés : RADIO 1 et RADIO 2. Aucun des 2 boutons n'est sélectionné. Cliquez sur RADIO 1, il sera affiché : Action sur RADIO 1. Cliquez sur RADIO 2, il sera affiché Action sur RADIO 1 et sur la ligne suivante, il sera affiché Action sur Radio2

Explications :

Souvenez-vous de ce que je vous ai dit sur l'action sur un bouton radio.

Si action sur bouton radio2 lorsque radio1 est sélectionné, il y a forcément 2 évènements "changement d'état" qui sont générés. L'un sur radio1 qui passe de l'état sélectionné à celui de non sélectionné. L'autre sur radio2 qui passe de l'état de non sélectionné à celui de sélectionné. J'ai utilisé cette fois, l'interface ItemListener. Au début, pas de bouton sélectionné. Donc, l'action sur radio1 conduit à un seul évènement. C'est pourquoi on voit s'afficher seulement Action sur RADIO 1. Mais en cliquant sur le bouton radio2, on a 2 évènements qui se produisent. L' un qui est d'abord la non sélection de radio1. C'est pourquoi on voit s'afficher la phrase : Action sur RADIO 1 Puis l'autre évènement qui est la sélection de radio2. C' est pourquoi en ligne suivante, on voit s'afficher : Action sur RADIO 2

D'où le conseil suivant :

Lorsque vous traitez un évènement survenu lors du clic sur un bouton radio, préférez la méthode actionPerformed(). Dans les logiciels de commerce, vous avez dû le remarquer, on ne traite (presque) jamais l' évènement que constitue la non sélection d'un bouton radio. L'utilisateur d'un logiciel clique sur un bouton radio et il sait que ce qui se produit est forcément la conséquence de son choix et pas du tout la non sélection d'un bouton qu'il n'a même pas (ou plus) regardé en cliquant.

De manière générale toutefois, on préfère laisser à l'utilisateur du logiciel le temps de sélectionner un bouton radio. Et c'est le clic sur un bouton simple qui validera son choix. C'est plus prudent. Comme dans l'exemple ci-dessous.
 Exemple 3 : 

1.     import javax.swing.*;
2.     import java.awt.*;
3.     import java.awt.event.*;
4.     
5.     class Fenetre extends JFrame implements ActionListener
6.     {
7.         private JRadioButton radio1, radio2; private JButton bouton;
8.          public Fenetre()
9.          {
10.              setTitle("Une fenetre dynamique");
11.              Container c = getContentPane();
12.              c.setBackground(new Color(208, 208, 255));
13.              setSize(500, 300);
14.              c.setLayout(new FlowLayout());
15.              
16.              ButtonGroup groupeDeBoutons = new ButtonGroup();
17.
18.              radio1 = new JRadioButton("RADIO 1");
19.              groupeDeBoutons.add(radio1);
20.              c.add(radio1);
21.            
22.              radio2 = new JRadioButton("RADIO 2");
23.              groupeDeBoutons.add(radio2);
24.              c.add(radio2);
25.
26.              setLocationRelativeTo(this.getParent()); 
27.              
28.              bouton = new JButton("Bouton de Validation");
29.              c.add(bouton);
30.              bouton.addActionListener(this);
31.              setDefaultCloseOperation(3);
32.          }
33.    
34.
34.          public void actionPerformed(ActionEvent a)
35.          {
36.               String situation1, situation2;
37.               
38.              if(radio1.isSelected() )
39.              situation1 = "RADIO 1 sélectionné";               
40.              else
41.              situation1 = "RADIO 1 non sélectionné";
42.              
43.              if(radio2.isSelected() )
44.              situation2 = "RADIO 2 sélectionné";               
45.              else
46.              situation2 = "RADIO 2 non sélectionné"; 
47.              
48.              System.out.println("Etat des cases : " + situation1 + " et " + situation2);             
49.          }
48.    }
50.    
51.    public class TesterClicRadio3
52.    {
53.         public static void main(String [] args)
54.         {
55.              Fenetre f = new Fenetre();
56.              f.setVisible(true);
57.         }
58.    }

Compilez puis exécutez ce programme. Il sera affiché :

Une fenêtre graphique contenant 2 boutons radio appelés RADIO 1 et RADIO 2. En plus, un bouton simple appelé BOUTON DE VALIDATION. Cliquez sur l'un ou l'autre des boutons. Il ne se passe rien.
Le clic d'un bouton désactive l'autre si ce dernier était préselectionné.
Le clic sur le bouton de validation donne l'état des 2 boutons : sélectionné ou non sélectionné.


Explications :

Le clic sur un bouton Radio ne donne rien parce que aucun des boutons n'est associé à un objet écouteur. Par contre, le clic sur le bouton conduit à l'éxécution de la méthode actionPerformed(). Normal, le bouton simple est associé à un objet écouteur. Cet objet est la fenêtre elle-même. Regardez ligne 30 : this représente la fenêtre puisque c'est sa classe qui implémente l'interface ActionListener qui contient le méthode actionPerformed().
J'ai reçu un message d'une personne me demandant pourquoi affiche-t-on des choses sur la fenêtre console, alors qu'on est en programmation graphique? ... Pourquoi ne pas afficher directement sur la fenêtre graphique.

Réponse :

Pour l'instant, nous apprenons en mettre en oeuvre la programmation évènementielle à travers divers composants graphiques. Ce n'est pas grave si on affiche encore en fenêtre console. Mais à partir du prochain chapitre, nous allons commencer à afficher sur la fenêtre graphique. cela dit, rassurez-vous, nous aurons au moins un chapitre consacré aux véritables exercices corrigés en programmation graphique. Dans ce cas, tout sera sur la fenêtre graphique.
La connaissance, c'est bien. La partager, c'est mieux
Conseiller ce site à un(e) ami(e):

Son e-mail est :       
Une suggestion à faire pour ce site ? ... Contact : webmaster@debutantprog.com
← (précédent) D.4 Evènements cases à cocher
D.6 Evènements sur les champs de texte
Accueil S O M M A I R E

D.5 Evènements sur les boutons radio