• Aucun résultat trouvé

11.4 Le thread de gestion des ´ev´enements

11.5.3 Principaux types d’´ev´enements

Chaque type d’´ev´enement correspond `a une interface d’auditeurs. Les principales (et les seules en AWT ) sont les suivantes :

MouseListener

L’interface MouseListener concerne les ´ev´enements isol´es83g´en´er´es `a l’aide de la souris. Il s’agit d’´ev´enements

de bas niveau, c’est-`a-dire des actions avec la souris sur des composants qui ne sont pas ´equip´es pour traduire ces gestes ´el´ementaires en informations de plus haut niveau, comme c’est le cas pour les boutons, les menus, etc. Les m´ethodes de cette interface sont :

83Par ´ev´enements isol´es  nous entendons les ´ev´enements autres que les trains d’´ev´enements que produisent les d´eplacements

11 INTERFACES GRAPHIQUES 11.5 Ev´enements´

void mousePressed(MouseEvent e) Appel´ee lorsqu’un bouton de la souris a ´et´e press´e, le pointeur se trouvant sur le composant dont on guette les ´ev´enements.

void mouseReleased(MouseEvent e) Appel´ee lorsqu’un bouton de la souris a ´et´e relˆach´e, alors qu’il avait ´et´e press´e quand le pointeur se trouvait sur le composant dont on guette les ´ev´enements.

void mouseClicked(MouseEvent e) Appel´ee lorsque la souris a ´et´e  cliqu´ee  (press´ee puis relˆach´ee au mˆeme endroit), le curseur se trouvant sur le composant dont on guette les ´ev´enements. De par sa d´efinition, cet ´ev´enement est toujours pr´ec´ed´e d’un ´ev´enement mouseReleased. La r´eciproque n’est pas vraie : un ´ev´enement mouseReleased n’est suivi d’un ´ev´enement mouseClicked que si la position de la souris n’a pas chang´e depuis le dernier ´ev´enement mousePressed.

void mouseEntered(MouseEvent e) Appel´ee lorsque le pointeur de la souris commence `a  survoler  le composant dont on guette les ´ev´enements.

void mouseExited(MouseEvent e) Appel´ee lorsque le pointeur de la souris cesse de survoler  le compo- sant dont on guette les ´ev´enements.

L’argument de ces m´ethodes est un objet MouseEvent. Les m´ethodes les plus int´eressantes d’un tel objet sont :

getX(), getY() qui renvoient les coordonn´ees84du pointeur au moment o`u l’´ev´enement a ´et´e notifi´e,

getButton() qui permet de savoir quel bouton a ´et´e press´e. MouseMotionListener

Cette interface concerne les mouvements de la souris. Lorsqu’on fait bouger la souris sans appuyer sur un de ses boutons on dit qu’on la d´eplace  (move), lorsqu’on la fait bouger tout en maintenant un bouton press´e on dit qu’on la traˆıne  (drag). Cette interface comporte donc deux m´ethodes :

void mouseMoved(MouseEvent e) Appel´ee lorsque la souris change de position sans qu’aucun bouton ne soit press´e.

void mouseDragged(MouseEvent e) Appel´ee lorsque la souris change de position avec un de ses boutons press´e.

Il faut ˆetre plutˆot sobre en impl´ementant les m´ethodes pr´ec´edentes, car elles ont `a traiter des ´ev´enements qui arrivent par trains. Selon les performances du syst`eme utilis´e, un grand nombre d’appels de ces m´ethodes est g´en´er´e pendant un seul d´eplacement de la souris. Il faut que la r´eponse soit courte pour ne pas introduire un asynchronisme d´esagr´eable.

KeyListener

Il se produit un ´ev´enement clavier chaque fois qu’une touche est press´ee ou relˆach´ee. Tous les composants peuvent ˆetre sources de tels ´ev´enements, il suffit qu’ils aient le focus . Cette interface se compose de trois m´ethodes :

void keyPressed(KeyEvent e) Appel´ee lorsqu’une touche a ´et´e press´ee. void keyReleased(KeyEvent e) Appel´ee lorsqu’une touche a ´et´e relˆach´ee. void keyTyped(KeyEvent e) Appel´ee lorsqu’un caract`ere a ´et´e saisi au clavier.

Les ´ev´enements keyPressed et keyReleased sont de bas niveau. Chacun correspond `a une touche unique, et fournit un code num´erique (le code de touche virtuelle, ou VK code). En particulier, keyPressed est le seul moyen de d´etecter la pression d’une touche ne produisant pas de caract`ere (comme Shift ,  Ctrl , etc.).

L’´ev´enement keyTyped, au contraire, est assez ´elabor´e, puisqu’il est capable d’agr´eger plusieurs touches press´ees ensemble pour former un unique caract`ere : A majuscule, Control-C, etc.

L’argument de ces m´ethodes est un objet KeyEvent, dont les m´ethodes les plus int´eressantes sont : char getKeyChar() Renvoie le caract`ere associ´e `a l’´ev´enement clavier (compte tenu des ´eventuelles touches

de modification) Dans le cas de keyPressed et keyReleased il peut n’exister aucun caract`ere Unicode repr´esentant la touche concern´ee, la valeur KeyEvent.CHAR UNDEFINED est alors renvoy´ee.

int getKeyCode() Dans le cas de keyPressed et keyReleased, renvoie le code de touche virtuelle corres- pondant `a la touche press´ee ou relˆach´ee. Dans le cas de keyTyped, le r´esultat est KeyEvent.VK UNDEFINED. Sur beaucoup de syst`emes, si l’utilisateur maintient une touche press´ee, un flot d’´ev´enements keyPressed est g´en´er´e.

FocusListener

Les ´ev´enements qui nous int´eressent ici concernent l’acquisition ou la perte du focus par un composant. A tout moment, un seul composant a le focus ; par d´efinition, c’est `a lui que sont adress´es les ´ev´enements du clavier. G´en´eralement, un composant acquiert le focus lorsqu’il subit un clic de la souris ; le composant qui avait le focus `a ce moment-l`a le perd. La pression successive de la touche tabulation fait ´egalement circuler le focus parmi les composants plac´es sur un mˆeme conteneur.

void focusGained(FocusEvent e) Appel´ee lorsque le composant en question acquiert le focus (c’est-`a-dire que les actions sur le clavier lui seront d´esormais adress´ees).

void focusLost(FocusEvent e) Appel´ee lorsque le composant perd le focus (un autre composant l’a pris).

ActionListener

Cette interface concerne des actions (avec la souris ou le clavier) sur un composant qui les traduit en une commande de plus haut niveau, comme un choix dans une liste ou un menu, une pression sur un bouton, etc. L’interface se compose d’une seule m´ethode :

void actionPerformed(ActionEvent e) Appel´ee lorsqu’une action a ´et´e faite (ce que action  veut dire d´epend du composant : presser un bouton, cocher ou d´ecocher une case `a cocher, faire un choix dans un menu, etc.).

L’argument de cette m´ethode est un objet ActionEvent, muni de la m´ethode

String getActionCommand() Renvoie une chaˆıne qui identifie l’action en question. En r`egle g´en´erale, il s’agit d’une chaˆıne ´ecrite sur le composant sur lequel l’action de l’utilisateur s’est effectu´ee : le titre d’un bouton press´e ou d’une case coch´ee, le texte de l’´el´ement de liste ou de l’item de menu choisi, etc.

Fig. 11 – Trois boutons

Exemple : voici la d´efinition d’une classe Panneau tr`es na¨ıve qui est un conteneur portant trois boutons (voyez la figure 11) et, en mˆeme temps, l’auditrice des actions dont ces boutons sont la source :

import javax.swing.*; import java.awt.event.*;

class TroisBoutons extends JPanel implements ActionListener { public TroisBoutons() {

JButton bouton = new JButton("Oui"); bouton.addActionListener(this); add(bouton);

bouton = new JButton("Non"); bouton.addActionListener(this); add(bouton);

bouton = new JButton("Euh..."); bouton.addActionListener(this); add(bouton);

11 INTERFACES GRAPHIQUES 11.5 Ev´enements´

public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("Oui"))

System.out.println("Il a dit oui"); else if (e.getActionCommand().equals("Non"))

System.out.println("Il a dit non"); else

System.out.println("Il ne sait pas"); }

public static void main(String[] args) { JFrame cadre = new JFrame("Boutons");

cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cadre.getContentPane().add(new TroisBoutons()); cadre.pack(); cadre.setVisible(true); } }

Voici une autre mani`ere d’´ecrire une classe fonctionnellement identique `a la pr´ec´edente, en utilisant les r´ef´erences des boutons plutˆot que leurs chaˆınes action command85 :

import javax.swing.*; import java.awt.event.*;

class TroisBoutons extends JPanel implements ActionListener { JButton bOui, bNon;

public TroisBoutons() {

bOui = new JButton("Oui"); bOui.addActionListener(this); add(bOui);

bNon = new JButton("Non"); bNon.addActionListener(this); add(bNon);

JButton bouton = new JButton("Euh..."); bouton.addActionListener(this);

add(bouton); }

public void actionPerformed(ActionEvent e) { if (e.getSource() == bOui)

System.out.println("Il dit Oui"); else if (e.getSource() == bNon)

System.out.println("Il dit Non"); else

System.out.println("Il ne sait pas"); }

public static void main(String[] args) { JFrame cadre = new JFrame("Boutons");

cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cadre.getContentPane().add(new TroisBoutons()); cadre.pack(); cadre.setVisible(true); } }

85Cette mani`ere de faire est plus efficace, puisqu’on remplace les comparaisons equals  par des comparaisons  == , mais

ItemListener

Il se produit un  ´ev´enement d’item  lorsqu’un item est s´electionn´e ou d´eselectionn´e. Par item nous entendons ici un ´el´ement d’une liste d´eroulante, d’une liste de choix, une case `a cocher, etc. Une seule m´ethode dans cette interface :

void itemStateChanged(ItemEvent e) Appel´ee lorsqu’un item a ´et´e s´electionn´e ou d´eselectionn´e. AdjustmentListener

Cette interface concerne les actions faites sur des barres de d´efilement. Une seule m´ethode :

void adjustmentValueChanged(AdjustmentEvent e) Appel´ee lorsque le curseur de la barre de d´efilement a ´et´e d´eplac´e (quelle qu’en soit la raison : on a tir´e le curseur, on a cliqu´e sur une des fl`eches de la barre ou bien on a cliqu´e sur la barre en dehors du curseur).

En g´en´eral, `a la suite d’un tel ´ev´enement on interroge la barre de d´efilement `a l’aide de la m´ethode getValue de la classe Scrollbar. Dans le cas o`u l’on dispose de plusieurs barres de d´efilement on peut utiliser la m´ethode Object getSource() pour identifier celle qui est la source de l’´ev´enement.

Ces ´ev´enements ne sont pas d’un usage aussi fr´equent qu’on pourrait le penser car, dans la plupart des ap- plications, les barres de d´efilement des fenˆetres sont g´er´ees par la machinerie interne des objets JScrollPane. TextListener

Les ´ev´enements de cette interface notifient les modifications du texte en cours de saisie dans un champ ou une zone de texte. Une seule m´ethode :

void textValueChanged(TextEvent e) Appel´ee lorsque le texte concern´e a chang´e.

On notera que les champs de texte (JTextField et JPasswordField) produisent ´egalement un ´ev´enement action lorsque l’utilisateur presse la touche Entr´ee , ce qui est souvent l’´ev´enement r´eellement guett´e. WindowListener

Les ´ev´enements que cette interface concerne sont les actions sur une fenˆetre : ouverture et fermeture et, dans le cas d’un cadre ou d’un dialogue, les actions sur les ´el´ements de la barre de titre. Ce qui donne les m´ethodes :

void windowClosing(WindowEvent e) Appel´ee lorsque l’utilisateur essaye de fermer la fenˆetre en agissant sur son  menu syst`eme  ou sa case de fermeture. Dans le cas du cadre principal d’une application c’est ici qu’on doit mettre l’´eventuel code de confirmation avant terminaison, voir l’exemple ci-dessous. void windowActivated(WindowEvent e) Appel´ee lorsque la fenˆetre est rendue active.

void windowDeactivated(WindowEvent e) Appel´ee lorsqu’une fenˆetre cesse d’ˆetre la fenˆetre active. void windowClosed(WindowEvent e) Appel´ee lorsque la fenˆetre a ´et´e ferm´ee, suite `a un appel de sa

m´ethode dispose. Ne pas confondre cet ´ev´enement, qui n’a de sens que pour une fenˆetre fille (apr`es la fermeture du cadre principal il n’y a plus d’application) avec l’´ev´enement windowClosing.

void windowOpened(WindowEvent e) Appel´ee lorsqu’une fenˆetre est rendue visible pour la premi`ere fois. void windowIconified(WindowEvent e) Appel´ee lorsqu’une fenˆetre est minimis´ee (iconifi´ee).

void windowDeiconified(WindowEvent e) Appel´ee lorsqu’une fenˆetre qui avait ´et´e minimis´ee (iconifi´ee) retrouve une taille normale.