Introduction à SwingStates
Interaction avec les menus

Dans cet exercice, pour simplifier les problèmes de placement, on considère que les items de menu ont une hauteur fixe de 20 pixels et un largeur fixe de 50 pixels, et on recommande d'utiliser la police de caractères suivante : Font font = new Font("verdana", Font.PLAIN, 12) ;

Vous pouvez partir du programme suivant (Menus.java) et compléter les machines à états, ou partir des versions simplifiées adaptées à chaque étape.

Dans la suite de cet exercice, on considère des menus hiérarchiques à deux niveaux :

1. Menu contextuel linéaire

Programmer un menu contextuel simple : le coin supérieur gauche s'affiche à la position du clic, et le menu disparaît lorsque l'on relâche le bouton. Les items du menu se mettent en surbrillance lorsque l'on passe dessus. Pour cela chaque item est constitué d'un rectangle, sensible à la souris, et d'un texte qui lui ne l'est pas.

Pour cette question, vous pouvez partir de la version simplifiée suivante : Menus_1.java

2. Barre de menus "cliquer-tirer"

Programmer des menus déroulants avec une barre de menus. L'interaction est similaire à celle du menu contextuel ci-dessus : les menus déroulants s'affichent tant que le bouton de la souris est appuyé et que l'on est sur la barre de menus ou dans le menu déroulant courant.

Pour cette question, ainsi que pour les deux questions suivantes, vous pouvez partir de la version simplifiée suivante : Menus_2.java

3. Barre de menus "clic-clic"

Toujours avec les menus déroulants, programmer l'interaction qui consiste à cliquer pour faire apparaître le menu, et cliquer à nouveau pour sélectionner l'item ou en dehors du menu pour annuler la sélection.

4. Barre de menus mixte

Combiner les deux techniques d'interaction des questions 2 et 3 pour qu'elles soient disponibles simultanément : un cliquer-tirer déclenche la technique 2 et un clic simple la technique 3.

5. Menu hiérarchique

Programmer un menu contextuel hiérarchique fonctionnant avec l'interaction de la question 2. Faire en sorte que le sous-menu ne s'affiche pas tout de suite lorsque la souris entre dans l'item parent, et faire en sorte qu'il ne s'efface pas non plus immédiatement lorsqu'elle le quitte, de façon à permettre une sélection "en diagonale" du sous-menu.

Pour cette question, vous pouvez partir de la version simplifiée suivante : Menus_5.java

6. Menu détachable

Revenir à la barre de menus de la question 2 et ajouter les menus détachables : un geste rapide lorsque l'on quitte un en-tête de menu détache le sous-menu, qui suit alors la souris et est transformé en palette lorsqu'on relâche le bouton. On peut alors sélectionner dans la palette ou fermer celle-ci.

Pour cette question, vous pouvez partir de la version simplifiée suivante : Menus_6.java

7. Menu circulaire

Programmer un menu circulaire hiérarchique avec des menus à 4 ou 8 entrées et une sélection par cliquer-tirer. Représenter le menu soit sous forme de "parts de gâteau", soit sous forme d'étoile. Dans les deux cas, la zone de sélection des items est un secteur en forme de part de gâteau. (La présentation en forme d'étoile permet de rendre plus visible ce qui est sous le menu.)

Pour cette question, ainsi que pour la question suivante, vous pouvez partir de la version simplifiée suivante : Menus_7.java

8. Marking menus

Ajouter la sélection par marque dans le menu circulaire : lorsque l'on déplace le curseur immédiatement après l'appui sur le bouton, le menu n'apparait pas mais on dessine l'encre et on reconnait s'il s'agit d'une sélection dans le menu.

Pour cela plutôt que d'utiliser l'algorithme de Rubine, on utilise un algorithme ad hoc : il calcule la distance de chaque point de l'encre à la droite passant par ses points extremaux et mémorise le point à distance maximale ainsi que cette distance. Si elle est inférieure à un seuil, on considère qu'il s'agit d'un segment rectiligne, dont l'angle nous donne l'item sélectionné. Sinon, on coupe le segment en deux au point qui est à distance maximale, et on teste si chaque sous-segment est lui-même rectiligne, selon la même méthode. Si c'est le cas, l'angle du premier sous-segment nous donne la sélection dans le menu principal et celui du second sous-segment la sélection dans le sous-menu correspondant.