TP sur les interfaces graphiques

Page Home (contact) Retour TPs

Support de cours

But de ce TP :

Le morceau d'application que vous allez écrire est une interface graphique qui sera réutilisée dans le TP sur les entrées-sorties pour permettre à un utilisateur de changer son mot de passe. Il est donc important de terminer ce TP avant le le TP sur les entrées-sorties.

L'utilisateur entre son mot de passe actuel. Il tape 2 fois un nouveau mot de passe. Pour modifier son mot de passe l'utilisateur doit cliquer sur le bouton "Lancer la modification". Si l'utilisateur a tapé correctement son mot de passe actuel et 2 fois le même nouveau mot de passe, celui-ci devient son nouveau mot de passe.


Le look

L'interface devra ressembler à ceci (au look and feel près) :

Pour les mots de passe vous pouvez utiliser la classe JPasswordField pour que les mots de passe ne s'affichent pas et la classe JTextField pour la saisie du nom de login. Le bouton placé en bas lance la modification du mot de passe.

Pour ce premier exercice, vous avez seulement à reproduire l'aspect (le look) de l'interface. L'appui sur le bouton du bas ne provoquera aucune action. Le code qui lancera les traitements provoquées par les actions de l'utilisateur (le feel) sera ajouté dans l'exercice suivant.

Important : vérifiez le bon comportement de votre interface en modifiant la taille de la fenêtre. Les labels doivent garder la même taille et les zones de saisies doivent s'agrandir en largeur mais pas en hauteur si vous agrandissez la fenêtre. Pour vous aider, allez lire cet article détaillé sur les layout managers ; allez voir en particulier la section "A Very Common Layout Need" ; une solution qui pourra vous être utile dans des cas plus complexes est donnée à la fin de la section suivante "Allowing the labels and text fields to stretch".

A la place de la méthode donnée dans cet article, vous pouvez préférer utiliser GroupLayout (introduit par Java SE 6).

Les classes de l'interface graphique seront dans le paquetage fr.unice.utilisateur.gui.

Bien disposer les composants d'une interface graphique n'est pas toujours facile. En voici une preuve (attention, nécessite Flash, et c'est mieux avec le son ; cliquez sur le triangle après le chargement).

Correction :

GUI.java sans GroupLayout
Avec GroupLayout


Le feel

Voici les actions qui devront être déclenchées par l'interface graphique :

  1. Lorsque l'utilisateur a tapé un bon login et mot de passe, une instance de la classe fr.unice.utilisateur.Utilisateur est récupérée. Cette instance sera utilisée dans le reste de l'application (pas demandé pour ce TP) pour identifier l'utilisateur et savoir s'il a droit d'accéder à certaines fonctionnalités. Vous utiliserez cette classe Utilisateur (étudiez son code). Pour savoir si l'utilisateur a tapé le bon mot de passe, vous utiliserez la méthode getUtilisateur de la classe Utilisateur ; si l'utilisateur a tapé le bon mot de passe, cette méthode renvoie l'instance de la classe Utilisateur qui correspond au nom saisi, sinon elle renvoie null.
  2. Ensuite (ou avant le point précédent, c'est comme vous voulez), il faut vérifier que le nouveau mot de passe a bien été tapé 2 fois de façon identique.
  3. Si c'est le cas, le mot de passe de l'utilisateur doit être modifié dans l'instance de Utilisateur (méthode setMdp de la classe Utilisateur).

Un fichier des mots de passe sera utilisé dans le TP sur les entrées-sorties mais les mots de passe pourraient être conservés par un tout autre moyen. Pour ce TP-ci, le mot de passe sera "toto" la première fois qu'un utilisateur sera rencontré dans la session de travail et ensuite on ne changera le mot de passe que dans l'instance de Utilisateur mais pas sur le support persistant (lisez la classe Utilisateur donnée ci-dessus). Pour préparer l'implémentation de la sauvegarde des mots de passe et pour cacher la manière de conserver les logins et mots de passe, les manipulations de login et de mot de passe devront être encapsulées dans des méthodes (ces méthodes seront implémentées avec du "vrai" code dans le TP sur les entrées-sorties).

Toute erreur ou exception (nom inconnu, l'utilisateur n'a pas tapé 2 fois le même nouveau mot de passe, exception quelconque) devra faire afficher une fenêtre de dialogue avec un message explicatif (classe JOptionPane, méthode showMessageDialog). Vous utiliserez une classe d'exception AccesException pour signaler les problèmes lors de la vérification du mot de passe (par exemple, une impossibilité de trouver le fichier des mots de passe si les mots de passe sont enregistrés dans un fichier). Pour simplifier, cette classe ne comporte que les constructeurs minimum d'une classe d'exception (voir cours sur les exceptions).

Correction :

GUI.java


Tâches en arrière-plan

Voici le code d'une interface graphique qui effectue une recherche supposée lente dans une base de données distante pour trouver des mots suivant un certain critère. En fait la recherche dans la base de données est simulée par une pause de 5 secondes ; voici le code du chercheur. Les mots trouvés sont affichés dans une zone de texte. Comme la recherche est lente, un message est affiché pour faire patienter l'utilisateur.

  1. Faites exécuter cette application et observez qu'elle ne fonctionne pas correctement : le message pour faire patienter l'utilisateur ne s'affiche qu'après le résultat de la recherche. De plus l'interface est figée ; on peut remarquer par exemple que le bouton de lancement de la recherche reste enfoncé pendant toute la recherche ou que le bouton pour stopper la recherche ne s'enfonce pas.
  2. Expliquez la raison de ce mauvais fonctionnement.
  3. Corrigez le code de l'application pour que l'interface ne soit plus figée et que le message pour faire patienter s'affiche avant le démarrage de la recherche.
  4. Ajoutez la possibilité d'interrompre la recherche avec le bouton placé en bas de l'interface graphique.

Correction :

Interface pas figée

Possible d'interrompre la recherche


Pour ceux qui ont déjà fini :

Compléments indispensables

Le peu de temps imparti aux interfaces graphiques dans ce cours n'est pas suffisant pour écrire des interfaces graphiques riches et surtout ergonomiques.

Allez voir les 2 TPs sur les interfaces graphiques des années précédentes (tp1 et tp2) pour apprendre à utiliser de nombreux autres composants. Vous pouvez aussi aller voir le tutoriel de Sun sur Swing.


Complément sur SwingWorker

Reprenez l'exercice sur les tâches en arrière-plan. Utilisez ce chercheur qui renvoie les mots trouvés un à un et publish/process de SwingWorker pour faire afficher les mots dès qu'ils sont trouvés.

Correction :

Main.java


Retour TPs