Les événements de bas niveau
Java distingue deux sortes d’événements : les événements de bas niveau et les événements sémantiques. Les premiers correspondent à des actions physiques de l’utilisateur sur le cla- vier ou la souris ; c’est par exemple le cas d’un clic dans une fenêtre. Les seconds sont des événements plus élaborés qui, bien que toujours générés suite à une action physique de l’uti- lisateur, ont été « interprétés » par l’environnement et par Java, afin de leur attribuer une signi- fication. C’est par exemple le cas de l’action sur un bouton, qui peut trouver son origine dans un clic à la souris ou dans une frappe au clavier. Il en va de même pour la saisie dans un champ de texte, qui résulte en fait d’une succession d’événements de bas niveau (frappes de touches, clics éventuels…).En toute rigueur, la distinction entre ces deux sortes d’événements comporte une part d’arbi- traire, dans la mesure où même un événement de bas niveau comme un clic nécessite une part d’interprétation, pour fournir les coordonnées (relatives) du clic à l’intérieur du composant concerné. De plus, Java classe dans les événements de bas niveau des événements liés à la gestion des fenêtres ou à ce qu’on nomme la focalisation.La plupart du temps, nous nous sommes contentés d’exploiter l’événement clic (complet) géré par la méthode mouseClicked. En fait, les actions sur la souris génèrent d’autres événe- ments que nous allons examiner progressivement. Nous considérerons tout d’abord les évé- nements les plus simples correspondant à l’appui et/ou au relâchement d’un bouton. Nous verrons ensuite comment identifier le bouton concerné et comment gérer les doubles clics. Puis nous étudierons les différents événements liés au déplacement de la souris, ce qui nous permettra de vous montrer comment mettre en œuvre les opérations dites de « glisser ».
Java génère un événement à chaque appui (mousePressed) sur un bouton et à chaque relâche- ment (mouseReleased). De plus, à partir de la succession de ces deux événements (appui et relâchement d’un bouton), il génèrera un événement « clic complet » (mouseClicked), à condi- tion que la souris n’ait pas été déplacée entre temps.Nous avons déjà vu que ces trois méthodes mousePressed, mouseReleased et mouseClicked appartiennent à l’interface MouseListener (qui comporte également deux autres méthodes mouseEntered et mouseExited dont nous parlerons un peu plus loin).Voici un exemple de programme qui se contente de « tracer » ces trois événements en affichant en fenêtre console un message précisant les coordonnées de la souris (rappelons qu’on les obtient avec les méthodes getX() et getY() de la classe MouseEvent). L’exemple d’exécution comporte des commentaires mentionnant les actions de l’utilisateur.Nous verrons plus loin qu’il est possible de connaître le bouton associé à un événement. Cependant, pour pouvoir éliminer le faux clic précédent, il faudrait reconstituer l’évé- nement clic en gérant soi-même la succession des appuis et relâchements, ce que l’on fera rarement en pratique.Il est possible de connaître le(s) bouton(s) de la souris concerné(s) par un événement donné, en recourant à la méthode getModifiers de la classe MouseEvent. Elle fournit un entier dans lequel un bit de rang donné est associé à chacun des boutons et prend la valeur 1 pour indi- quer un appui. La classe InputEvent contient des constantes qu’on peut utiliser comme « mas- ques » afin de tester la présence d’un bouton donné dans la valeur de getModifiers :
Voici un exemple dans lequel nous traçons les mêmes événements que précédemment, mais en affichant les informations fournies par getModifiers, isPopupTrigger et getClickCount. Notez que, pour simplifier l’écriture du code, nous avons prévu une méthode de service (sta- tique) nommée details, chargée d’afficher ces différentes informations pour un événement donné (fourni en argument). Là encore, les actions réalisées lors de l’exécution sont indi- quées par des commentaires accompagnant les résultats fournis en fenêtre console.1 Java ne dispose que d’un seul compteur de clics pour les deux (ou trois) boutons. Cela signifie qu’on peut provoquer un double clic en cliquant successivement sur deux boutons différents. Si l’on veut absolument éviter ce phénomène, il faut effectuer un suivi plus fin des actions de l’utilisateur, en s’assurant que le premier et le second clic concernent bien le même bouton. Dans certaines applications, il est nécessaire de permettre à l’utilisateur d’effectuer un « glis- ser » de la souris. On nomme ainsi un appui sur un bouton de la souris suivi d’un déplacement de la souris et enfin d’un relâchement. Une telle opération permet de définir deux points d’une fenêtre qui peuvent servir par exemple à : facilite grandement la programmation d’une telle sélection. C’est ce que montre l’exemple suivant, dans lequel nous représentons par un rec- tangle la zone ainsi sélectionnée par l’utilisateur, chaque nouvelle sélection effaçant l’ancienne. Il suffit en effet d’exploiter les événements Notez que nous avons tenu compte de la possibilité pour l’utilisateur de sélectionner la zone dans n’importe quel sens. C’est ce qui justifie la détermination de la plus grande des deux abscisses de début et de fin, ainsi que de la plus grande des deux ordonnées