Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SWING : PARTIE 2 : ACTIONLISTENER, LISTENER, JBUTTON


Information sur le tutorial

Catégorie :Swing Date de création : 23/02/2006 19:18:20 Vu : 27 123 fois

Note :
9,14 / 10 - par 7 personnes
9,14 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (23)
Ajouter un commentaire et/ou une note


Description

C'est la deuxieme partie du mon tutorial sur la création d'interface graphique en Swing.

Tutorial

Swing

PARTIE 2 : Action !



Introduction

Voici la deuxieme partie du mon tutorial consacré à Swing. Dans la premiere partie, nous avons vu comment ouvrir des fenetres et y placer des composants. C'était un bon début mais il manque un peu de réactivité! En effet, on va voir comment gérer les événements, c'est a dire comment réagir aux differentes interactions avec l'interface. Par exemple, comment traiter le fait que l'utilisateur clique sur un bouton ? etc...

Concepts abordés :

-les listeners
-la programmation événementielle
-ActionListener, WindowListener etc...

1. Les Listeners


Swing utilise une architecture par événements. En effet, lorsque un composant de l'interface graphique le désire (enfin, lorsque une interaction se produit), il peut provoquer un événement. Un événement est ensuite transmit aux objets qui désirent etre informés de l'événement et réagir en conséquence. Ces objets sont des listeners (des "écouteurs"). Pour définir un listener, il suffit de créer une classe qui implemente une interface de type EventListener (http://java.sun.com/j2se/1.5.0/docs/api/java/util/EventListener.html pour  voir la liste des listeners disponibles). Ensuite, ce listener devra etre enregistré dans le composant de l'interface graphique dans lequel le listener veut "écouter". Le composant dispatche l'événement à tout ses listeners enregistrés.

2. ActionListener : réagir aux clics sur un JButton

Concrétement, si on veut etre avertit que l'utilisateur clique sur un boutton (JButton), on devra implanter une classe implantant un ActionListener http://java.sun.com/j2se/1.5.0/docs/api/java/awt/event/ActionListener.html)  (un ActionListener est un EventListener pour les JButton) et ajouter ce listener au JButton.

En pratique :

//création du bouton
JButton    but=new JButton("ici");

//Ajout de l'action listener
but.addActionListener(listener);

L'objet listener devra implémenter l'interface ActionListener : il devra donc obligatoirement contenir la fonction actionPerformed. Cette fonction sera la fonction qui sera appellé lorsqu'un événement se produit sur le bouton

Voici un exemple complet :

import  javax.swing.*;
import  java.awt.*;
import  java.awt.event.*;
 
//le listener est la classe test     
public class test extends JFrame implements ActionListener
{
   
    /** Constructeur de test */
    public test()
    {
        //titre de la fenetre
        super("Test");
       
        //panel
        JPanel  pan=new JPanel();
        pan.setLayout(new BorderLayout());
       
        //bouton ici
        JButton but=new JButton("Ici !");
       
        //ajoute un listener : ici le listener est cette classe
        but.addActionListener(this);
       
        //ajoute le boutton dans le panel
        pan.add(but,BorderLayout.CENTER);
       
        //
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(pan);
        pack(); //permet de mettre une bonne dimension a la fenetre
        setVisible(true);
    }
   
    /**
     * obligatoire car test implémente l'interface ActionListener
     */
    public  void    actionPerformed(ActionEvent e)
    {
        //quand on a cliqué sur le bouton ici
        System.out.println("Ici !");
    }
   
    public  static  void    main(String args[])
    {
        new test();
    }
}


Copiez ce code dans un fichier test.java puis compilez en faisant javac test.java -classpath ".;"
Pour lancez le programme, faites java test


Dans cet exemple, le listener est la classe elle meme. On respecte bien l'interface ActionListener puisque la fonction actionPerformed est définie. Quand on clique sur le bouton "ici", un message apparait sur la console.

Voici la fenetre obtenue :



Ici dans notre exemple, il y a qu'un seul bouton. Si on met plusieurs boutons, comment les differencier si tout les listeners sont la meme classe ? En effet si on fait le programme suivant :

import  javax.swing.*;
import  java.awt.*;
import  java.awt.event.*;
       
public class test extends JFrame implements ActionListener
{
    private JButton but1,but2;  //les boutons
   
    /** Constructeur de test */
    public test()
    {
        //titre de la fenetre
        super("Test");
       
        //panel
        JPanel  pan=new JPanel();
        pan.setLayout(new BorderLayout());
       
        //bouton ici
        but1=new JButton("Ici !");
       
        //ajoute un listener : ici le listener est cette classe
        but1.addActionListener(this);
       
        //ajoute le boutton dans le panel
        pan.add(but1,BorderLayout.CENTER);
       
        //2eme Bouton
        but2=new JButton("2eme !");
        but2.addActionListener(this);
        pan.add(but2,BorderLayout.SOUTH);
       
        //
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(pan);
        pack(); //permet de mettre une bonne dimension a la fenetre
        setVisible(true);
    }
   
    /**
     * obligatoire car test implémente l'interface ActionListener
     */
    public  void    actionPerformed(ActionEvent e)
    {
        //quand on a cliqué sur le bouton ici
        System.out.println("Ici !");
    }
   
    public  static  void    main(String args[])
    {
        new test();
    }
}


On obtient la fenetre suivante :



Lorsque vous cliquez sur le bouton "ici" et "2eme", on obtient le meme message. C'est normal car ces 2 boutons partagent le meme listener donc le meme gestionnaire d'événement.
2 solutions s'offrent à nous pour pouvoir faire un traitement differents selon les boutons :
-soit on créé deux classes distinctes implémentant un ActionListener qui seront associées a chacun des boutons
-soit en utilisant l'objet ActionEvent passé en parametre de actionPerformed pour différencier les 2 composants.

Nous allons bien sur voir ces 2 solutions !

Solution : Utilisation de ActionEvent

A la page http://java.sun.com/j2se/1.5.0/docs/api/java/awt/event/ActionEvent.html on peut voir les méthodes d'un ActionEvent. La fonction getSource() va nous etre utile.

getSource() renvoi le composant qui a provoqué l'événement.

Ainsi, pour différencier le traitement selon le bouton, on réagit en fonction de l'objet retourné par getSource() :
Voici la nouvelle fonction actionPerformed() :

public  void    actionPerformed(ActionEvent e)
    {
        Object  source=e.getSource();
       
        if  (source==but1)
            System.out.println("Ici !");
        else if (source==but2)
            System.out.println("2eme !");
    }


Maintenant, quand on clique sur le bouton "2eme !", le message affiché est "2eme !". On a différencié les 2 traitements.

La solution de réunir tous les traitement dans le meme listener peut se révéler parfois assez pratique et simple (quoique) mais en mon sens, elle n'est pas trés propre. La solution que nous allons voir aprés est a mon sens bien mieux.

Solution : Une classe par bouton

Pour différencier le traitement pour nos 2 boutons, nous pouvons créé 2 classes distinctes :

import  javax.swing.*;
import  java.awt.*;
import  java.awt.event.*;
       
public class test extends JFrame
{
    private JButton but1,but2;  //les boutons
   
    /** Constructeur de test */
    public test()
    {
        //titre de la fenetre
        super("Test");
       
        //panel
        JPanel  pan=new JPanel();
        pan.setLayout(new BorderLayout());
       
        //bouton ici
        but1=new JButton("Ici !");
       
        //ajoute un listener : ici le listener est cette classe
        but1.addActionListener(new TraitementBut1());
       
        //ajoute le boutton dans le panel
        pan.add(but1,BorderLayout.CENTER);
       
        //2eme Bouton
        but2=new JButton("2eme !");
        but2.addActionListener(new TraitementBut2());
        pan.add(but2,BorderLayout.SOUTH);
       
        //
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setContentPane(pan);
        pack(); //permet de mettre une bonne dimension a la fenetre
        setVisible(true);
    }
   
  
   
    public  static  void    main(String args[])
    {
        new test();
    }
   
   
    public  class   TraitementBut1 implements   ActionListener
    {
         /**
         * obligatoire car test implémente l'interface ActionListener
         */
        public  void    actionPerformed(ActionEvent e)
        {
            System.out.println("Ici !");
        }
    }
   
     public  class   TraitementBut2 implements   ActionListener
    {
         /**
         * obligatoire car test implémente l'interface ActionListener
         */
        public  void    actionPerformed(ActionEvent e)
        {
            System.out.println("2eme !");
        }
    }
}


La classe TraitementBut1  gere les événements sur le bouton "ici" et la classe TraitementBut2 sur le bouton "2eme !".

3. Les autres listeners

Il existe une énorme varité de listeners pour tout type d'événements. Chaque composant de l'interface graphique a ses événements.

Voici une petite liste des listeners :

WindowListener    tout les évenements concernant une fenetre (ouverture, fermeture, selection etc)
MouseListener    tout les évenements concernant la souris (clic, etc)
MouseMotionListener tout les évenement concernant le mouvement de la souris
...

Toutes les classes contenant le mot Listener est un listener, regardez la page http://java.sun.com/j2se/1.5.0/docs/api/ !

4. Fin

Cette deuxieme partie est finie. Vous pouvez m'envoyer vos commentaires/remarques.





27 février 2006 23:39:32 :
Modification du titre
01 mars 2006 09:58:44 :
-modification du titre
13 mars 2006 21:17:03 :
rajout des images (mais il y a toujours un bug sur le site web : il manque la galerie d'image...)
13 mars 2006 21:36:16 :
correction des erreurs dans les liens des images
signaler à un administrateur
Commentaire de Glain le 28/02/2006 17:16:44

Merci beaucoup pour c'est deux tuto, ils m'ont bien aidés. :)
J'espers que les suivants seront aussi intéressant.

signaler à un administrateur
Commentaire de tucobouch le 28/02/2006 17:49:16

Merci merci!! ça fait chaud au coeur :D

Au moins 2 autres tutoriels sur Swing sont prévus!! Mais bon, pour le moment je suis en vacances... faudra patienter un poil lol

Vous avez peut etre remarqué que dans le tuto il y a "IMAGE 1" etc : normalement, c'est des captures d'écran, elles n'y sont pas. Pour ceux que ça gene, sachez que c'est pas ma faute!! mais un bug du site (j'ai deja écrit aux admins en vain...) qui ne me permet pas de placer des images dans mon tuto... :D

signaler à un administrateur
Commentaire de holder le 31/03/2006 07:16:31

merci infiniment c'est dans ces deux tutoriel ke j'ai appris bcp de chose sur swing.

signaler à un administrateur
Commentaire de tucobouch le 31/03/2006 08:40:15

merci merci
mon tuto est juste une introduction a swing et vous donne toutes les bases pour pouvoir creer ses interfaces graphiques, néanmoins faudra quand meme coder par soit meme pour apprendre et s'ameliorer. De plus, le forum de JavaFR est toujours là!

signaler à un administrateur
Commentaire de rounhi le 16/04/2006 03:23:48

Merciiiiiiiiiiiiiiiiiiiiiiiiiii c vraiment bien ce que tu nous offre go on

signaler à un administrateur
Commentaire de Blooop le 09/05/2006 17:03:35

Salut et merci
j'ai une question, tu dis que la méthode la plus propre est de créer une class par listener, en admettant que j'ai 18 boutons, ça veut dire 18 class et donc 18 fichiers différents pour mettre une 10aines de lignes dans chaque? (il faut un fichier par class hein?)
Merci

signaler à un administrateur
Commentaire de tucobouch le 09/05/2006 19:01:28

Si tes boutons réalisent 18 fonctions differentes, oui peut etre... :D
Sinon, tu peux passer au modele MVC (Modele Vue Controleur) dont le controleur gerera tes boutons...
Faut pas avoir peur des fichiers, tu sait, un logiciel informatique c'est plusieurs centaines voire milliers de classes...

signaler à un administrateur
Commentaire de douuuud le 10/05/2006 11:04:36

Salut et bravo pour ton tuto
Il est vraiment clair et j'ai appris plein de choses.
Par contre j'aimerai bien savoir comment le fait de cliquer sur un bouton me permettrait de placer quelque part dans le panel un carré ou un rectangle, et une fois placé pouvoir le déplacer avec la souris. Si tu pouvais me dire comment faire je t'en serai éternellement reconnaissant, si si , éternellement !

signaler à un administrateur
Commentaire de vlaad le 26/11/2006 17:18:42

Superbe!!!
Très bon travail, ca m'a été super utile pour commencer le JAVA...
Merci beaucoup

signaler à un administrateur
Commentaire de master933 le 11/12/2006 23:02:29

Très bon travail !

Merci beaucoup :-)

signaler à un administrateur
Commentaire de lyame le 22/02/2007 16:48:30

Merci beaucoup, c'etait très interessant!!

Par contre j'aimerai bien savoir si c'est possible de générer ces événements sous format xml, en passant par un serveur qui écoute ce qui ce passe dans la fenetre et qui ensuite un fichier xml contenant toutes les actions qui ont été faite!!

Merci d'avance

signaler à un administrateur
Commentaire de jshinobi le 06/11/2007 07:42:35

bon boulot Commentaire
c 1 très bon travail
merci beacoup

signaler à un administrateur
Commentaire de weiston le 10/11/2007 20:16:09

impecable ton tuto, merci pour tout

signaler à un administrateur
Commentaire de lorgar le 14/01/2008 14:08:11

Merci pour le tuto

signaler à un administrateur
Commentaire de mahdicss18 le 22/03/2008 12:30:19

super

signaler à un administrateur
Commentaire de imenmr le 03/04/2008 17:45:55

C'est très bien expliqué.
Super
Merci

signaler à un administrateur
Commentaire de baratribord le 08/04/2008 23:53:18

J'ai développé une solution à mis chemin entre les deux où on envoi le pointeur de la fenêtre principale à la classe traitement qui est dans un autre fichier.


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Traitement implements ActionListener
{

Fenetre Fen;
public Traitement(Fenetre fen) {
Fen =fen;
}

public  void    actionPerformed(ActionEvent e)
{

Object  source=e.getSource();
      
        if  (source==Fen.ok)
         Fen.setSize(1024,768);
        else if (source==Fen.cancel)
         Fen.setSize(640,480);
}
}

Tout cela est bien sur une question d'habitude... :-)

signaler à un administrateur
Commentaire de saousyst le 01/09/2008 13:58:28

Très bon travail!
Merci beaucoup:).

signaler à un administrateur
Commentaire de Jonat95 le 26/09/2008 11:07:44

merci pour tes tutus, ils sont génials !

si je n'ai pas fait d'erreur, je dirais que

//ajoute un listener : ici le listener est cette classe
        but.addActionListener(this);

ne fonctionne pas. Apparament ça viendrait du "this"

signaler à un administrateur
Commentaire de limalima le 09/10/2008 17:28:22

c'est très interessant ton tutorial pour les débutants commme moi, merci infiniment,

signaler à un administrateur
Commentaire de aladino le 22/10/2008 14:39:44

gooooood merci
c'est géniale que vous faits

signaler à un administrateur
Commentaire de demahom82 le 13/11/2008 12:47:03

MERCI

signaler à un administrateur
Commentaire de wajdimostwanted le 21/11/2008 22:59:55

C'est très bien expliqué
Merci

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,016 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.