Programmation
événementielle
Cours Java - F. Michel
I. Nature des événements
Que se passe-t-il lors d'un clic ?
JFrame
MonJPanel
Que se passe-t-il lors d'un clic ?
● Un clic génère ce qu'on appelle un événement
Événement
● Il s'agit en fait d'un objet
L'objet [Link]
L'objet événement de Java
Qui crée ce type d'objet ?
● Il existe un thread spécifique, chargé de récupérer
les interactions utilisateurs (souris, clavier, etc.)
● Lors d’une interaction, ce thread instancie un
événement du type correspondant, avec le
composant concerné comme source.
● Conséquence : on ne crée pas les événements,
on ne fait que les gérer.
GUI → [Link]
II. Le package [Link]
Events bas niveau vs. sémantique
● 2 types d’événements sont distingués :
– bas niveau : e.g. clique de souris, clavier, etc.
– sémantiques : e.g. « le bouton X a été pressé »
● En priorité, on traite des events sémantiques :
– ils contiennent une information de plus haut niveau .
– Ils facilitent la gestion : presser un bouton avec le
clavier ou la souris revient au même.
[Link]
[Link]
[Link]
[Link]
[Link]
III. Gestion des événements
Comment gérer des événements ?
● Un très grand nombre d'événements sont générés
● Il est hors de question de tous les gérer
● Le principe consiste à écouter uniquement les
événements désirés sur les composants ciblés.
● → on crée des écouteurs, pour chaque event
désiré, et on les associent aux composants cibles
Qu'est-ce qu'un écouteur ?
● Un écouteur est un objet destiné à recevoir et à gérer les
événements générés
● Les écouteurs principaux se trouvent aussi dans le
package [Link]
● La plupart sont définis par une interface java : n'importe
quel objet peut devenir un écouteur.
● Exemple :
[Link]
[Link]
Création d'un écouteur
Utilisation de l'écouteur
● Au clique, rien ne se passe...
Principe de l'écoute
● Par défaut, un écouteur ne récupère pas tous les
événements produits par le système, heureusement !
● Il n'écoute que les objets qu'on lui dit d'écouter !
● Pour fonctionner, il doit être associé à un objet qui
génère des événements.
● Ainsi, les objets qui génèrent des événements possèdent
des méthodes qui permettent de leur associer les
écouteurs adéquats
[Link]
[Link]
Rappel sur l'application: 3 classes
JFrame MonJPanel
MonEcouteur
Utilisation d'un écouteur
2 boutons : 1 écouteur par objet
Remarques sur les écouteurs
● Il est possible d'ajouter plusieurs écouteurs à un
seul objet
● Il est possible d'écouter plusieurs objets avec un
seul écouteur
1 écouteur pour 2 objets
Problème : la source ?
● Comment faire pour distinguer les deux avec un
seul écouteur ?
Rappel : [Link]
On connaît la source !
Pour résumer
IV. Écoute des événements souris
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Autre exemple
Remarque : un objet peut être son
propre écouteur !
V. Sucre syntaxique
Listeners concrets dans le JDK
● Coder un [Link] peut être
fastidieux car plusieurs des méthodes de l'interface sont
souvent vides dans les implémentations :
Package [Link]
[Link]
Les adapters de [Link]
Gérer beaucoup d'écouteurs ?!
Un écouteur par composant ?
● A priori, il est fastidieux d'écrire un écouteur par
composant: une classe par composant !
Un écouteur pour n composants ?
● L'idée est alors d'écrire un écouteur qui gère
plusieurs composants :
Un écouteur pour n composants ?
● Inconvénients :
– Code peu efficace : beaucoup de tests pour pas grand-
chose
– Le code va devenir rapidement complexe et difficile à
maintenir
– Conséquence : solution à éviter lorsqu'on a beaucoup
de boutons
Que faire ?
Un écouteur par composant !
● En fait, il faut créer une nouvelle classe écouteur
par composant !
● Mais pas de manière classique (avec un fichier par
classe)
● Il est possible de définir une classe à l'intérieur du
code d'une autre classe
● Cela facilite grandement la gestion des écouteurs :
– On va créer la classe écouteur correspondant à un
composant immédiatement après son initialisation en
utilisant une classe interne anonyme !
Les classes internes anonymes
La classe interne anonyme
Création et ajout du pour définir l'écouteur du
bouton bouton
Gestion de
l'événement
Les classes internes anonymes
● Le code précédent correspond à ce qui est obtenu
automatiquement à l'aide des outils d'édition
graphique d'un IDE (Eclipse, Netbeans)
– Il y a une séparation entre :
● Le code généré automatiquement (la classe écouteur
anonyme)
● Le code géré par le programmeur (la méthode correspondant
à la gestion de l'événement) : monBouttonActionPerformed(ActionEvent evt)
● En pratique, rien n'empêche de coder directement
la gestion de l'événement au moment de la création
de l'écouteur
Exemple
Même chose pour la souris
Pour un bouton
Pour la souris
ActionListener en Java 8