mettons en oeuvre impose par ailleurs de spécifier le début et la fin d’un geste. Pour cela il est nécessaire
d’utiliser un mode d’interaction spécifique : utilisation d’une touche clavier ou d’un bouton souris autre
que ceux habituellement utilisés dans l’application (utilisation du bouton droit ou celui du milieu).
Afin de pouvoir exécuter des gestes sur n’importe quel composant d’une application, il est nécessaire
d’utiliser le glass pane de Swing. Le glass pane 2correspond à une sorte de vitre placée au dessus des
autres composants qui est complètement transparente par défaut et qui peut intercepter les événements
souris et clavier. Le glass pane permet également d’afficher au dessus des autres composants le geste en
cours de réalisation.
L’utilisation d’un glass pane nécessite de définir une classe qui hérite de JComponent et qui redéfinit
la méthode paintComponent. Pour intercepter les événements souris, il faut y attacher les listeners cor-
respondants. L’intégration du glass pane à l’application se fait en utilisant la méthode setGlassPane de
JFrame. Les fichiers TestGUI.java 3et MyGlassPane.java 4illustrent la mise en oeuvre du glass pane.
Dans l’exemple donné, le geste se spécifie en faisant un drag avec le bouton droit de la souris :
utilisation de e.getButton() == MouseEvent.BUTTON3 dans le code. Il se peut que la version de Java
installée sur votre machine ne permette pas de distinguer les boutons (e.getButton() renvoie toujours 0).
Dans ce cas, remplacez le bouton droit par la touche control par exemple. Remplacez alors l’instruction
précédente par e.isControlDown(). Dans ce cas, vous ne pourrez pas spécifier de geste sur la liste.
Figure 3 – Le glass pane.
3 L’algorithme
L’algorithme de reconnaissance prend en entrée une liste de points qui correspond à la position du
pointeur de la souris à l’écran au cours du temps suite, par exemple, à un geste de drag avec le bouton
droit de la souris. Cette liste de points suit les traitements successifs suivants :
1. Ré-échantillonnage pour avoir un nombre de points constant indépendamment de la fréquence
d’échantillonnage du périphérique (nombre d’acquisition du signal par seconde) et de la vitesse
d’exécution du geste
2. Rotation du geste pour le rendre indépendant de l’angle suivant lequel il est exécuté par rapport à
l’écran
3. Mise à l’échelle du geste pour le rendre indépendant de la taille suivant laquelle il est réalisé
4. Translation du geste pour le rendre indépendant de la position à laquelle il est réalisé
La liste de points obtenue est alors comparée à chacun des templates existants en appliquant une
série d’ajustements angulaires pour trouver l’alignement optimal. Le template correspond à un geste de
référence auquel on associe une liste de points et un nom. Chaque comparaison permet de calculer une
note comprise entre 0 et 1 qui reflète le degré de similarité entre le geste réalisé et le template, calculé
comme une distance euclidienne entre les deux gestes. Le template qui obtient le score le plus élevé est
considéré comme le geste exécuté.
2. http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html
3. TestGUI.java
4. MyGlassPane.java
2