
FAQ Java GUIConsultez toutes les FAQ
Nombre d'auteurs : 37, nombre de questions : 155, derni�re mise � jour : 10 octobre 2015 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.
Nous tenons � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant r�dacteur, lisez ceci.
- Que sont les listeners ?
- Comment utiliser les listeners (M�thode 1) ?
- Comment utiliser les listeners (M�thode 2) ?
- Comment utiliser les listeners (M�thode 3) ?
- Qu'est-ce qu'est et comment utiliser ActionListener ?
- Qu'est-ce qu'est et comment utiliser KeyListener ?
- Qu'est-ce qu'est et comment utiliser MouseListener ?
- Qu'est-ce qu'est et comment utiliser WindowListener ?
- Qu'est-ce qu'est et comment utiliser FocusListener ?
- Qu'est-ce qu'est et comment utiliser ItemListener
Dans le contexte d'une interface graphique (Swing, AWT, etc.), les listeners permettent au programmeur de r�agir suite aux actions de l'utilisateur (clic de souris, touche du clavier enfonc�e, etc.).
Les � listeners � sont des interfaces. Ces interfaces fournissent une ou plusieurs m�thodes qui peuvent donc �tre impl�ment�es diff�remment selon les cas et les besoins, pour r�pondre aux �v�nements.
Les interfaces � listener � sont pr�sentes principalement dans le package java.awt.event, mais �galement dans le package javax.swing.event.
Chaque listener dispose d'une classe Event associ�e. Cette classe �tend java.awt.event.EventObject et fournit une description de l'�v�nement captur�. Par exemple, la classe ActionEvent d�crit les �v�nements captur�s par un ActionListener.
Il y a plusieurs mani�res d'utiliser les listeners, vous trouverez ces m�thodes dans les Q/R suivantes.
Voici la pr�sentation et quelques explications sur la premi�re possibilit� concernant l'utilisation des listeners.
1�re possibilit� : impl�mentation de l'interface dans la classe principale.
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import java.awt.event.ActionListener; // �tape 1 : d�claration de la classe public class MaClasse implements ActionListener { // �tape 3 : Cr�ation de deux boutons JButton monBouton = new JButton("Mon Bouton"); JButton monBouton2 = new JButton("Mon Bouton2"); public MaClasse() { // �tape 4 : On ajoute � l'�couteur � sur le bouton � monBouton �. monBouton.addActionListener(this); // Puis sur monBouton2 monBouton2.addActionListener(this); } /* �tape 2 :Cette m�thode est d�clar�e dans l'interface ActionListener. Il nous faut l'impl�menter. */ public void actionPerformed(ActionEvent e) { // �tape 2bis if(e.getSource() == monBouton) { // Bouton 1 a �t� cliqu� }else { // Bouton 2 a �t� cliqu� } } } |
Le cas de l'interface ActionListener est simple puisqu'elle ne contient qu'une m�thode.
M�thode que nous impl�mentons � l'�tape 2 justement.
Nous cr�ons un bouton Swing � l'�tape 3.
� l'�tape 4, nous ajoutons un � listener � sur les boutons pr�c�demment cr��s. La m�thode addActionListener est d�finie dans la classe AbstractButton, classe parente de JButton. Cette m�thode attend un param�tre de type ActionListener.
La classe MaClasse impl�mente cette interface, elle peut �tre justement consid�r�e comme du type ActionListener. Nous pouvons donc fournir l'op�rateur 'this' en param�tre, qui repr�sente l'instance en cours de la classe MaClasse.
Concr�tement, qu'avons nous fait ? Nous avons demand� aux boutons monBouton et monBouton2 qu'ils nous pr�viennent lorsqu'un utilisateur les actionne (c'est le r�le du � listener � ActionListener en particulier). Et comment ? En utilisant la m�thode actionPerformed, d�finie dans l'interface ActionListener et surcharg�e dans la classe MaClasse.
Nous avons deux boutons, mais une seule m�thode actionPerformed. Nous devons donc diff�rencier (�tape 2bis) la source de l'�v�nement, monBouton ou monBouton2.
La boucle est boucl�e.
2�me m�thode : utilisation des classes anonymes.
Une deuxi�me possibilit� est d'utiliser les classes anonymes. Voici quelques explications, toujours avec un code pour l'exemple.
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // �tape 1 : d�claration de la classe public class MaClasse { // �tape 2 : cr�ation de deux boutons. JButton monBouton = new JButton("Mon Bouton"); JButton monBouton2 = new JButton("Mon Bouton 2"); /* �tape 3 : cr�ation de la classe anonyme */ monBouton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Cette m�thode ne sera appel�e que pour les �v�nements sur le bouton monBouton. } }); /* On refait la m�me chose pour le deuxi�me bouton */ monBouton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Cette m�thode ne sera appel�e que pour les �v�nements sur le bouton monBouton2. } }); } |
Tout d'abord, notre classe MaClasse n'impl�mente pas l'interface ActionListener. Aucune instance de la classe MaClasse ne pourra donc �tre utilis�e dans la m�thode addActionListener.
Nous cr�ons deux boutons � l'�tape 2. L'�tape 3 est la plus int�ressante. Nous d�finissons une instance de l'interface ActionListener dans une classe anonyme, sans garder de r�f�rence vers cette classe anonyme. Dans ce cas, nous devons le faire deux fois, une fois pour chaque bouton (il faut une classe anonyme pour chaque composant d�clenchant un �v�nement).
Un avantage de cette m�thode est un code plus l�ger au niveau de l'impl�mentation des �v�nements. En effet, nous n'avons pas � dissocier les composants � source � (les composants �cout�s par le listener), comme nous le faisons dans la premi�re possibilit�.
En contrepartie, nous devons cr�er une classe anonyme � chaque fois. Une autre possibilit� qui est une simple variante de celle pr�sent�e ici est la suivante :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // �tape 1 : d�claration de la classe public class MaClasse { // �tape 2 : cr�ation de deux boutons. JButton monBouton = new JButton("Mon Bouton..."); JButton monBouton2 = new JButton("Mon Bouton 2..."); /* �tape 3 : cr�ation de la classe anonyme */ ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent e) { if(e.getSource() == monBouton) { // Bouton 1 a �t� cliqu� }else { // Bouton 2 a �t� cliqu� } } }; monBouton.addActionListener(listener); monBouton2.addActionListener(listener); } |
3�me m�thode : cr�ation d'une classe d�di�e.
Code java : | S�lectionner tout |
1 2 3 4 5 | // Fichier : MonListener.java public class MonListener implements ActionListener { public void actionPerformed(ActionEvent e) { } } |
Code java : | S�lectionner tout |
monButton.addActionListener(new MonListener());
ActionListener est, comme son nom l'indique, un listener utilis� pour r�agir aux actions utilisateurs. Celles-ci sont multiples, la principale �tant l'activation d'un bouton (par un clic ou par appui de la touche Entr�e lorsque le bouton est s�lectionn�).
Une seule m�thode est d�clar�e dans cette interface : public void actionPerformed(java.awt.event.ActionEvent e).
La classe ActionEvent �tend la classe java.util.EventObject et h�rite donc de ses m�thodes. Parmi elles, getSource() est particuli�rement int�ressante. Elle renvoie l'objet concern� par l'�v�nement (par exemple le bouton qui a �t� cliqu�).
Cela nous permettra de diff�rencier les composants sources dans l'impl�mentation de la m�thode actionPerformed.
La classe ActionEvent fournit quant � elle quelques m�thodes sp�cifiques aux �v�nements d'action. Les plus utilis�es sont getWhen() et getActionCommand().
getWhen() r�cup�re le timestamp Unix marquant le d�clenchement de l'�v�nement, tandis que getActionCommand() retourne le nom de la commande associ�e � l'�v�nement (par exemple, le texte du bouton � l'origine de l'action).
Voici une simple impl�mentation d'un ActionListener, utilisant la premi�re m�thode d'impl�mentation propos�e :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [...] import java.awt.event.*; // �tape 1 : d�claration de la classe public class MaClasse implements ActionListener { // �tape 2 : cr�ations des boutons JButton monBouton = new JButton("Un bouton vivant"); JButton monBouton2 = new JButton("Un bouton vivant2"); public MaClasse() { // �tape 3 : on ajoute le listener aux boutons monBouton.addActionListener(this); monBouton.addActionListener(this); } // �tape 4 : l'impl�mentation de l'ActionListener public void actionPerformed(ActionEvent e) { System.out.println("Un bouton a �t� cliqu�, timestamp : " + e.getWhen()); // �tape 5 : diff�renciation de la source d'�v�nement if(e.getSource() == monBouton || e.getActionCommand() == monBouton.getText()) { System.out.println("C'est le bouton 1 !"); }else if(e.getSource() == monBouton2 || e.getActionCommand() == monBouton2.getText()) { System.out.println("C'est le bouton 2 !"); } } } |
Cependant, nous avons deux boutons, et un clic sur chacun d'eux invoquera la m�me impl�mentation de l'ActionListener. Nous devons donc diff�rencier le bouton source de l'action. Cela peut se r�aliser de deux fa�ons : soit on compare le libell� du bouton avec celui de l'action captur�e, soit on compare le bouton et l'objet source de l'�v�nement.
Les deux m�thodes sont pr�sent�es � l'�tape 5. Notez que mettre ces deux tests (comparaison de libell�s et comparaison de sources) dans une m�me condition est superflu, un seul des deux tests est n�cessaire pour savoir quel bouton a �t� actionn�.
Le KeyListener est utilis� pour r�agir aux �v�nements du clavier, et est donc utilisable sur des composants permettant la saisi de texte (JTextField, JTextArea, etc).
Trois m�thodes sont d�clar�es dans l'interface du KeyListener : keyTyped(KeyEvent e), keyPressed(KeyEvent e) et keyReleased(KeyEvent e). Elle permettent respectivement de r�agir lorsqu'une touche a �t� : tap�e (press�e puis rel�ch�e), press�e, rel�ch�e.
La classe KeyEvent �tend java.util.EventObject et dispose donc des m�thodes d�clar�es dans cette classe (notamment getSource() ), mais fournit �galement une dizaine d'autres m�thodes sp�cifiques aux �v�nements relatifs au clavier. Parmi elles : getKeyChar() retourne le caract�re associ� � la touche appuy�e, getKeyCode() r�cup�re le code de la touche press�e, isActionKey() retourne true si la touche appuy�e est une touche d'action (CAPS LOCK, Verr Num, etc), et getKeyText(int keyCode) retourne le texte associ�e � la touche (par ex. F1, A, etc).
La derni�re m�thode, getKeyText, est statique et ne s'utilise donc pas avec l'instance de KeyEvent fournie.
Les codes retourn�s par la m�thode getKeyCode() sont utiles pour d�terminer la touche press�e.
Voici une simple impl�mentation d'un KeyListener, utilisant la premi�re m�thode d'impl�mentation propos�e :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import java.awt.event.*; // �tape 1 : on cr�e la classe et on impl�mente KeyListener. public class MaClasse implements KeyListener { // �tape 2 : on cr�e un composant JTextField private JTextField textField = new JTextField(); public MaClasse() { // �tape 3 : on ajoute le listener au composant textField.addKeyListener(this); } // �tape 4 : on impl�mente la m�thode keyTyped d�finie dans l'interface KeyListener public void keyTyped(KeyEvent e) { /* Cette m�thode est appel�e quand l'utilisateur appuie sur une touche Unicode (donc les caract�res) et ne prend pas en compte les touches comme F1, Echap, ALT, etc. */ System.out.println(e.getKeyChar()); } // �tape 5: on impl�mente la m�thode keyPressed d�finie dans l'interface KeyListener public void keyPressed(KeyEvent e) { /* Cette m�thode est appel�e quand l'utilisateur appuie sur une touche. Il est conseill� de ne pas utiliser getKeyChar() mais getKeyCode(), car les touches sp�ciales comme F1 ou Echap ne disposent pas d'un �quivalent en Unicode, et donc ne peuvent �tre repr�sent�es en char. */ System.out.println(KeyEvent.getKeyText( e.getKeyCode() ); if(e.getKeyCode() == KeyEvent.VK_ESCAPE) { System.out.println("L'utilisateur a appuy� sur Echap"); } } // �tape 6 : on impl�mente la m�thode keyReleased d�finie dans l'interface KeyListener public void keyReleased(KeyEvent e) { // Le fonctionnement est le m�me que pour keyPressed, sauf que cette m�thode est appel�e quand la touche est rel�ch�e. } } |
Enfin, sachez que si vous trouvez trop lourd de devoir impl�menter les trois m�thodes alors qu'une seule vous suffit, il existe la classe abstraite java.awt.event.KeyAdapter.
Vous pouvez soit cr�er une classe qui �tendra KeyAdapter, soit faire une classe anonyme.
Exemple :
Code java : | S�lectionner tout |
1 2 3 4 5 | monTextField.addKeyListener( new KeyAdapter() { public void keyTyped(KeyEvent e) { } }); |
Le MouseListener est utilis� pour les �v�nements relatifs � la souris (clics, d�placements).
Cinq m�thodes sont d�clar�es dans l'interface MouseListener : mouseClicked(MouseEvent e) pr�vient des clics (la souris a �t� press�e puis rel�ch�e), mousePressed(MouseEvent e) pour les pressions sur la souris (donc on enfonce le bouton sans le rel�cher), mouseReleased(MouseEvent e) pr�vient du rel�chement d'un bouton de la souris, mouseEntered(MouseEvent e) indique que la souris est entr�e dans l'espace d'un composant, mouseExited(MouseEvent e) indique que la souris est sortie de l'espace d'un composant.
La classe MouseEvent �tend java.util.EventObject et dispose donc des m�thodes d�clar�es dans cette classe (notamment getSource() ), mais fournit �galement douze autres m�thodes sp�cifiques aux �v�nements relatifs � la souris, notamment getButton() retourne le bouton qui a �t� cliqu�, getClickCount() retourne le nombre de clics (utile pour g�rer le double clic), getLocationOnScreen() retourne un objet Point repr�sentant la position de la souris � l'�cran, et enfin isPopupTrigger() pr�cise si le bouton cliqu� est celui habituellement utilis� pour afficher la liste d�roulante (bouton droit sur le bureau Windows par exemple).
Voici un exemple d'impl�mentation d'un MouseListener :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | public class MaClasse implements MouseListener { public void mousePressed(MouseEvent e) { // Cette m�thode est appel�e quand l'utilisateur appuie le bouton sur le composant �cout� } public void mouseReleased(MouseEvent e) { // Cette m�thode est appel�e quand l'utilisateur rel�che le bouton sur le composant �cout� } public void mouseClicked(MouseEvent e) { // Cette m�thode est appel�e quand l'utilisateur a cliqu� (appuy� puis rel�ch�) sur le composant �cout� if(e.getClickCount() == 2) { System.out.println("Il y a eu un double clic"); } Point p = e.getLocationOnScreen(); System.out.println("La souris est aux coordonn�es : x=" + p.getX() + ";y=" + p.getY() + " de l'�cran."); } public void mouseEntered(MouseEvent e) { // Cette m�thode est appel�e quand la souris entre dans la zone du composant �cout� System.out.println("La souris vient d'entrer..."); } public void mouseExited(MouseEvent e) { // Cette m�thode est appel�e quand la souris sort de la zone du composant �cout� System.out.println("La souris vient de sortir... rattrapez l� :)"); } } |
Il existe donc une classe abstraite MouseAdapter qui vous permet d'impl�menter seulement les m�thodes qui vous int�ressent.
Exemple :
Code java : | S�lectionner tout |
1 2 3 4 | monPanel.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { } } |
Le WindowListener est utilis� pour les �v�nements relatifs aux fen�tres (activation, fermeture, ouverture, etc.).
Cette interface d�clare sept m�thodes : windowActivated(WindowEvent e) indique que la fen�tre a �t� activ�e, windowDeactivated(WindowEvent e) indique que la fen�tre n'est plus la fen�tre active, windowClosed(WindowEvent e) indique que la fen�tre a �t� ferme�, windowClosing(WindowEvent e) indique que l'utilisateur a demand� la fermeture de la fen�tre, windowOpened(WindowEvent e) est appel�e la premi�re fois que la fen�tre est rendue visible, windowIconified(WindowEvent e) indique que la fen�tre a �t� r�duite dans la barre de t�che, windowDeiconified(WindowEvent e) indique que la fen�tre a �t� restaur�e depuis la barre de t�che.
La classe WindowEvent �tend java.util.EventObject et dispose donc des m�thodes d�clar�es dans cette classe (notamment getSource() ), mais fournit �galement cinq autres m�thodes sp�cifiques aux �v�nements relatifs aux fen�tres, notamment getNewState() et getOldState() qui fournissent respectivement le nouvel �tat et l'ancien �tat de la fen�tre, mais aussi getWindow(), qui retourne la fen�tre source de l'�v�nement.
Afin d'ajouter un WindowListener sur une fen�tre, vous disposez de la m�thode addWindowListener(WindowListener) de la classe Window (�tendue par la classe JFrame notamment).
Voici un exemple d'impl�mentation d'un WindowListener :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class MaClasse implements WindowListener { // [...] public MaClass() { maFenetre.addWindowListener(this); } public void windowOpened(WindowEvent e) { System.out.println("On vient de m'ouvrir !"); } public void windowClosed(WindowEvent e) { System.out.println("On m'a ferm� !") } public void windowClosing(WindowEvent e) { System.out.println("On veut me fermer !"); } public void windowIconified(WindowEvent e) { System.out.println("Je suis r�duite � une ic�ne !"); } public void windowDeiconified(WindowEvent e) { System.out.println("Je suis restaur�e !"); } public void windowActivated(WindowEvent e) { System.out.println("Je suis activ�e"); } public void windowDeactivated(WindowEvent e) { System.out.println("Je suis d�sactiv�e"); } } |
Le FocusListener est utilis� pour les �v�nements relatifs au focus clavier.
Cette interface d�clare deux m�thodes : focusGained(FocusEvent e) indique que le composant a gagn� le focus clavier tandis que focusLost(FocusEvent e) indique que le composant a perdu le focus clavier.
La classe FocusEvent �tend java.util.EventObject et dispose donc des m�thodes d�clar�es dans cette classe (notamment getSource() ), mais fournit �galement trois autres m�thodes sp�cifiques aux �v�nements relatifs aux fen�tres, notamment isTemporary() qui indique si le composant n'a le focus que temporairement, et getOppositeComponent() qui retourne l'autre composant impliqu� dans le changement de focus.
Afin d'ajouter un FocusListener, vous disposez de la m�thode addFocusListener(FocusListener) de la classe Component.
Voici un exemple d'impl�mentation d'un FocusListener :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class MaClasse implements FocusListener { public MaClasse() { monComposant.addFocusListener(this); } public void focusGained(FocusEvent e) { System.out.println("On a gagn� le focus"); } public void focusLost(FocusEvent e) { System.out.println("On a perdu le focus"); } } |
Le ItemListener est utilis� pour les �v�nements relatifs aux �l�ments (liste, checkbox, etc.).
Cette interface d�clare une seule m�thode : itemStateChanged(ItemEvent e) qui indique que l'�l�ment a chang� d'�tat.
La classe ItemEvent �tend java.util.EventObject et dispose donc des m�thodes d�clar�es dans cette classe (notamment getSource() ), mais fournit �galement quatre autres m�thodes sp�cifiques aux �v�nements relatifs aux fen�tres, notamment getItem() qui retourne l'�l�ment affect� par l'�v�nement, getStateChange() retourne le nouvel �tat de l'�l�ment (s�lectionn� ou d�s�lectionn�), et getItemSelectable() qui retourne le composant originaire de l'�v�nement.
Afin d'ajouter un ItemListener sur les composants qui le permettent (les boutons, JcomboxBox, les listes, etc), vous disposez de la m�thode addItemListener(ItemListener).
Voici un exemple d'impl�mentation d'un ItemListener :
Code java : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class MaFrame extends JFrame implements ItemListener { private JComboBox choix; // [...] public MaFrame() { choix = new JComboBox(); choix.addItemListener(this); } public void itemStateChanged(ItemEvent e) { if(e.getStateChange() == ItemEvent.SELECTED) { System.out.println("Un nouveau choix est s�lectionn�*: " + e.getItem().toString()); }else if(e.getStateChange() == ItemEvent.DESELECTED) { System.out.println("*Un choix est d�s�lectionn�*: " + e.getItem().toString()); } } } |
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.