:: Enseignements :: ESIPE :: E4INFO :: 2011-2012 :: Interface graphique ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Dessin, table et encore du MVC - Correction |
Exercice 1 - De bien belles formes...
On souhaite gérer des formes géométriques définies par un type (carré, cercle, ...), une couleur, des coordonnées,
une indication de taille et une profondeur servant à déterminer dans quel ordre on veut dessiner les formes.
Une telle forme est définie dans la classe
Shape. Les types de forme
possibles sont définis dans l'énumération
ShapeType. Les formes
seront stockées dans un
ShapeModel, dont une implémentation est
fournie dans la classe
ShapeModelImpl.
-
Compléter les classes Shape et ShapeType pour pouvoir réellement afficher les formes cercle et carré.
-
Écrire une classe DrawingArea qui étende JComponent. Son constructeur prendra en paramètre un
ShapeModel et sa méthode paintComponent(Graphics g) devra afficher sur un fond blanc toutes les formes
du modèle, en respectant l'ordre de profondeur.
-
Tester votre DrawingArea avec un ShapeModel sur lequel vous aurez préalablement invoqué
plusieurs fois la méthode generateShape().
Exercice 2 - ...qui méritent un petit rafraîchissement...
On veut maintenant ajouter de nouvelles formes périodiquement.
-
Utiliser un javax.swing.Timer pour générer une nouvelle forme dans le modèle toutes les 2 secondes.
-
Afin d'obtenir un rafraîchissement correct, le modèle doit prévenir la vue à chaque création de forme.
Pour cela, vous utiliserez l'interface ShapeListener.
Ajouter à l'interface ShapeModel la méthode addShapeListener. Dans ShapeModelImpl, implémenter cette méthode ainsi que
fireShapeAdded, qui doit être protected. Modifier la méthode generateShape() pour qu'elle notifie l'insertion d'une forme aux
listeners dûment enregistrés.
-
Enregistrer votre DrawingArea auprès du modèle et tester l'application qui doit maintenant se rafraîchir
comme une grande. Doit-on utiliser paintImmediately ou repaint ?
-
Optimiser le dessin en ne redessinant que la zone correspondant à la nouvelle forme, en utilisant la méthode getBounds de
la classe Shape.
Exercice 3 - ...servi sur une table...
La maison ne reculant devant aucun sacrifice, on se propose maintenant de doter l'application d'une deuxième vue des formes,
via une JTable. Problème: il faut un TableModel et notre ShapeModel n'en est pas un. Solution:
créer un adapteur qui puisse montrer correctement à la JTable les informations concernant les formes.
-
Écrire une classe ShapeTableModel qui étende AbstractTableModel. Son constructeur prendra
en paramètre le ShapeModel contenant les données. Remplir les méthodes getRowCount,
getColumnCount et getValueAt, sachant que l'on souhaite les colonnes suivantes:
type, couleur,x,y et profondeur.
-
Redéfinir la méthode getColumnName. Utiliser votre modèle dans une JTable et
mettre celle-ci dans un JScrollPane.
-
Enregistrer votre ShapeTableModel auprès du modèle sous-jacent pour être prévenu des ajouts de formes.
Faire le fire* nécessaire pour que la JTable se rafraîchisse correctement.
-
La méthode setDefaultRenderer de la classe JTable permet d'associer un renderer à
un type d'objet. Utiliser cette méthode pour associer aux objets Color un renderer qui affiche
cette couleur au lieu d'un texte comme java.awt.Color[r=71,g=15,b=162].
Exercice 4 - ...qu'on va débarrasser
-
Cliquer sur les formes affichées dans l'applet.
-
Dire: "Oh non! on va pas devoir coder ça quand même!"
Et si. Heureusement, on dispose de la gentille méthode contains dans la classe java.awt.Shape.
-
Ajouter un MouseListener sur le DrawingArea qui, pour chaque clic, récupère ses coordonnées et
teste pour chaque forme si elle contient le clic (attention à l'ordre dans lequel on teste les formes). Si on a
trouvé une forme qui contient le clic, on la supprime du modèle.
-
Ajouter à l'interface ShapeListener une méthode pour notifier une suppression de forme et coder le
fire* correspondant dans l'implémentation du modèle.
-
Ajouter tout ce qui manque pour que les deux vues se rafraîchissent correctement à chaque suppression.
Exercice 5 - un petit supplement
Utilisons encore notre modèle : Modifiez le titre de la fenêtre de votre application
afin qu'elle affiche en temps réel le nombre de carré et de cercle affiché.
Ajoutez une barre de menu dans votre fenetre. Ce menu (menu) contiendra un item pour quitter l'application.
Ajoutez dans le menu un item qui supprime toutes les formes.
Ajoutez dans le menu un item passant l'affichage des formes en noir ou en couleurs (l'affichage doit se mettre
à jour en temps réel)
Ajoutez dans le menu un systeme permettant d'avoir des objets de toutes les formes, ou uniquement des cercles, ou
uniquement des carrés. Bien sûr, lors du choix de "carré", tous les cercles doivent disparaitre de l'écran
© Université de Marne-la-Vallée