14 La gestion d’événements Cours 14 Cours 14
Qu’est-ce qu’un événement ? On distingue : Evénements sémantiques (signification) Evénement de bas niveau Comment est représenté un événement Evénements sémantiques, par exemple cliquer sur un bouton. Evénements de bas niveau tels l'enfoncement du bouton gauche de la souris, le relâchement ou le déplacement. Cours 14 Cours 14
Comment est représenté un événement Quand ? Que faire ? Un événement est représenté par un objet mémorisant : L’endroit où il s’est produit la source La date et l’heure. A qui doit-on le transmettre pour le traiter l’écouteur. Les méthodes utilisables pour accéder à l’information. Cours 14 Cours 14
Diffusion d’un objet événement C O U T R S Diffusion d’un objet événement vers les écouteurs Source La source est un objet Les écouteurs sont des objets Cours 14 Cours 14
L’objet source doit choisir ses écouteurs objetSource.addEvenementListener(objet écouteur) ; Exemple monBouton.addActionListener(monEcouteur) L’écouteur peut être l’objet émetteur : objetSource.addEvenementListener(this) ; Cours 14 Cours 14
L’objet écouteur implémente l’interface prévue pour traiter l’événement. Les actions à entreprendre sont spécifiées à cet endroit là. L’interface d’écoute définit les en-têtes méthodes qui doivent impérativement être implémentées. Qui doivent être implémentées Unification du traitement des événements en Java Cours 14 Cours 14
Les classes les plus courantes EventObject Object getSource() Les classes les plus courantes AWTEvent Toutes les classes dérivent de EventObject. ActionEvent ComponentEvent InputEvent WindowEvent MouseEvent KeyEvent Cours 14 Cours 14
Exemple : réponse à un clic sur un bouton Un clic sur un bouton génère un événement de la classe ActionEvent. L’écouteur doit implémenter l’interface ActionListener. Cette interface définit un en-tête de méthode que l’on doit implémenter: public void actionPerformed(ActionEvent e) C’est dans cette méthode que l’on traite l’événement e reçu. Dans la classe ActionEvent on dispose des accesseurs : String getActionCommand() int getModifiers() long getWhen() String paramString() e = paramètre formel d’entrée Cours 14 Cours 14
Programmation de l’exemple On se propose de changer aléatoirement la couleur du fond d’une fenêtre grâce à un bouton. On crée une fenêtre. On lui ajoute un panneau. A ce panneau on ajoute un bouton. Le bouton déclenche le changement de couleur du panneau. Cours 14 Cours 14
Pour répondre à un clic sur un bouton on doit : Choisir un écouteur, Cet écouteur doit implémenter l’interface ActionListenener, C’est-à-dire programmer la méthode public void actionPerformed(ActionEvent e) Cours 14 Cours 14
Première variante : on crée une classe Ecouteur interne à la classe MaFenêtre import java.awt.event.*; import java.awt.*; public class Bouton2 { public static void main( String[] args ) new MaFenêtre(« Test bouton"); // Noter l’objet anonyme } } //************************************************************************** Cours 14 Cours 14
class MaFenêtre extends Frame // Définition de la fenêtre { Button monBouton; Panel panneau; MaFenêtre(String titre) super(titre); // Appel du constructeur ancêtre panneau = new Panel(); monBouton = new Button("Changer la couleur"); monBouton.addActionListener (new Ecouteur()); Noter l’objet anonyme panneau.add(monBouton); add(panneau); setBounds(400, 200, 230, 100); setVisible(true); } //--------------------------------- fin du constructeur ………………. Expliquer classe interne problème de visibilité de panneau e est le nom du paramètre d’entrée, ici on ne s’en sert pas. Cours 14 Cours 14
public void actionPerformed (ActionEvent e) // a quoi sert e ??? Suite class Ecouteur implements ActionListener // Classe interne Pourquoi interne ???? { public void actionPerformed (ActionEvent e) // a quoi sert e ??? // On repeint le fond. Tirage pseudo aléatoire int a = (int)(255*Math.random()); int b = (int)(255*Math.random()); int c = (int)(255*Math.random()); panneau.setBackground(new Color(a, b, c)); panneau.repaint(); } } // *********************************************** Fin de la classe interne } //****************************************************** Fin de la classe MaFenêtre Interne pour qu’elle ait accès au champ panneau. Cours 14 Cours 14
Seconde variante : la classe interne devient une classe anonyme monBouton.addActionListener ( new Ecouteur() ); Devient : monBouton.addActionListener ( new ActionListener() { public void actionPerformed(ActionEvent e) int a = (int)(255*Math.random()); int b = (int)(255*Math.random()); int c = (int)(255*Math.random()); panneau.setBackground(new Color(a,b,c)); panneau.repaint(); } ) ; Cours 14 Cours 14
Ou, en écriture condensée : monBouton.addActionListener (new ActionListener() { public void actionPerformed(ActionEvent e) { int a = (int)(255*Math.random()); int b = (int)(255*Math.random()); int c = (int)(255*Math.random()); panneau.setBackground(new Color(a,b,c)); panneau.repaint(); }}) ; Cours 14 Cours 14
La notion de classe adaptatrice Cours 14 Cours 14
Classes d’événements ActionEvent AdjustementEvent ItemEvent TextEvent Clic sur un bouton, sélection d'un élément de menu ou de liste, pression sur la touche Entrée dans un champ de texte AdjustementEvent Déplacement de la barre de défilement ItemEvent Sélection de cases à cocher ou d'éléments d'une liste TextEvent Le contenu d'une zone texte a changé ComponentEvent Le composant a été déplacé, affiché, caché, ou sa taille a changé ContainerEvent Un composant a été ajouté ou retiré à un conteneur FocusEvent Un composant a obtenu ou perdu le focus KeyEvent Une touche du clavier a été enfoncée ou relâchée MouseEvent Enfoncement, relâchement, déplacement WindowEvent Activation, désactivation, fermeture, mise en icône Cours 14 Cours 14
Tableau de synthèse Événements générés par Interface Classe adaptatrice Méthodes Type du paramètre Accesseurs Button List MenuItem TextField ActionListener actionPerformed ActionEvent getActionCommand getActionModifiers Window WindowListener WindowAdapter windowClosing windowOpened windowIconified windowDeinconified windowClosed windowActivated windowDeactivated WindowEvent getWindow Cours 14 Cours 14