L'objectif de ce TP est la réalisation d'une petite application de dessin : JDraw.
Au final, l'application permettra à l'utilisateur de créer des objets graphiques (points, segments, ovales, rectangles, zone de textes, ...), d'en modifier leur emplacement et propriétés par le biais de boîtes de dialogue et de sauvegarder puis relire dans un fichier les dessins créés.
Voici l'applet dont vous allez vous inspirer, l'interface étant des plus simples : le bouton gauche de la souris permet de déplacer les objets, un click droit fait apparaître une fenêtre de propriétés. Nous verrons plus tard comment ajouter des objets, etc.
JTable
et de l'introspection, affichez une table des objets graphiques et leurs propriétés (sérialisation ou pas sérialisation ?).xfig
à la poubelle.jdraw | Le package principal |
jdraw.graphicalobjects | Le package des objets graphiques (points, rectangles, ellipses, segments, blocs de texte, ...) |
jdraw.images | Le package contenant les images |
jdraw.ui | Le package contenant les composants de l'interface graphique |
jdraw.JDraw | La classe principale, qui à la fois exporte une méthode statique main et étend javax.swing.JApplet |
jdraw.GraphicalObjectManager | L'objet maintenant la liste des objets graphiques, indiquant l'objet le plus proche d'un point spécifié, ... |
jdraw.graphicalobjects.GraphicalObject | La classe mère des objets graphiques du package ayant une position et une couleur |
jdraw.graphicalobjects.Point | La classe d'objet graphique Point |
jdraw.graphicalobjects.TextArea | La classe d'objet graphique Texte |
jdraw.graphicalobjects.SizedGraphicalObject | La classe mère des objets graphiques du package ayant une position, une couleure et une taille |
jdraw.graphicalobjects.Ellipse | La classe d'objet graphique Ellipse |
jdraw.graphicalobjects.Rectangle | La classe d'objet graphique Rectangle |
jdraw.graphicalobjects.Segment | La classe d'objet graphique Segment |
jdraw.ui.MainFrame | La fenêtre principale de l'application |
jdraw.ui.GraphicalObjectCanvas | Le composant qui affiche les objets graphiques et transmet les actions de l'utilisateur (click-droit, drag &drop, ...) au GraphicalObjectManager . |
jdraw.ui.GraphicalObjectProperties | La fenêtre d'édition des propriétés des objets graphiques simples (position et couleur), et classe mère des autres fenêtres de propriétés. |
jdraw.ui.SizedGraphicalObjectProperties | La fenêtre d'édition des propriétés des objets graphiques ayant un taille (en plus de la position et de la couleur). |
jdraw.ui.TextAreaProperties | La fenêtre d'édition des propriétés des objets texte (position, couleur + texte et fonte). |
Visualiser le diagramme de classe (2540*1340, 245Ko).
jdraw.graphicalobjects.GraphicalObject
, ont les propriétés communes suivantes : int x
- l'abcisseint y
- l'ordonnéejava.awt.Color color
- la couleurjava.awt.Cursor cursor
- un curseur de souris (propriété en lecture-seule)String friendlyname
- un nom "à visage humain" utilisé comme titre des fenêtres d'édition des propriétés (propriété en lecture-seule)java.awt.Rectangle boundingbox
- les coordonnées du rectangle délimitant l'objet (propriété en lecture-seule)jdraw.graphicalobjects.SizedGraphicalObject
, ont les propriétés communes suivantes : int width
- la largeurint height
- la hauteurjdraw.graphicalobjects.TextArea
a les propriétés supplémentaires suivantes : String text
- le textejava.awt.Font font
- la fonteint alignment
- l'alignement du texte rapport à la position de l'objet (SwingConstants.NORTH
, SwingConstants.CENTER
, ...)getXXX()
et setXXX( ... )
.java.beans.PropertyChangeEvent
correspondants, et une version "silencieuse" (dont l'identificateur est suffixé par _silent
), qui n'émet pas ces événements (voir plus bas). void paint( java.awt.Graphics )
d'affichage (invoquée par le manager d'objets graphiques, lorsque nécessaire).int getDistanceSq( java.awt.Point )
indiquant le carré de la "distance" de l'objet au point spécifié.void addPropertyChangeListener( java.beans.PropertyChangeListener )
et void removePropertyChangeListener( java.beans.PropertyChangeListener )
de gestion des écouteurs de changements de propriétés.GraphicalObjectProperties getPropertyDialog( Frame )
renvoyant la fenêtre de dialogue de changement de propriétés (voir plus bas).void prepareBoudingBoxEvent()
qui prépare l'événement de changement de bounding-box et void fireBoudingBoxChange()
qui émet réellement cet événement.boolean isDragInProgress()
, qui indique si un drag and drop est en cours.void startDragAndDrop( int, int )
, qui démarre un drag and drop à la position spécifiéevoid drag( int, int )
, qui poursuit le drag and drop.void suspendDragAndDrop()
, qui suspend le drag and drop en cours (lorsque l'on sort du canvas).void commitDragAndDrop( int, int )
, qui valide le drag and drop en cours à la position spécifiée.void rollbackDragAndDrop()
, qui annule le drag and drop en cours. Pour informer les composants intéressés (les listeners) d'événements émis par les objets graphiques, nous utiliserons la classe d'événements java.beans.PropertyChangeEvent
, et les listeners seront de type java.beans.PropertyChangeListener
.
Dans une première approche, les objets graphiques n'émettrons que des changements de la propriété (en lecture-seule) "BoundingBox", qui doit déclencher un réaffichage adéquat.
Il y a trois fenêtres de propriétés différentes :
jdraw.ui.GraphicalObjectProperties
pour les objets sans taille comme le point ;jdraw.ui.SizedGraphicalObjectProperties
pour les objets ayant une taille comme l'ellipse, le rectangle ou le segment ;java.ui.TextAreaProperties
pour les objets texte.jdraw.ui.GraphicalObjectProperties
propose les méthodes suivantes : void addPropertyGroup( JPanel )
, qui ajoute le panneau spécifiévoid loadValues()
, invoquée lorsque les valeurs doivent être lues à partir de l'objetvoid applyValues()
, invoquée lorsque l'objet doit être mis à jour à partir des valeurs indiquées par l'utilisateurvoid addPropertyGroup( JPanel )
loadValues()
et applyValues()
, en appelant la version mère en premier lieu GraphicalObjectProperties getPropertyDialog( Frame )
qui renvoie une fenêtre prète à être rendue visible, fraîchement instanciée ou recyclée jdraw.graphicalobjects.GraphicalObject
propose une méthode void openPropertyDialog( Frame )
qui rend visible la fenêtre de propriété récupérée via getPropertyDialog(...)
. Voici deux notes pour que JDraw puisse fonctionner à la fois comme une application directement exécutable ou comme une applet dans une page web :
jdraw.graphicalobjects.ui.MainFrame
(qui étend javax.swing.JFrame
pour la version application) propose une méthode statique (initRootPaneContainer
) qui initialise un javax.swing.RootPaneContainer
spécifié.RootPaneContainer
sera : MainFrame
dans le cas d'une application, et donc cette méthode sera appelée par le constructeur de MainFrame
;JApplet
(JApplet
implémente initRootPaneContainer
) dans le cas d'une applet, et donc cette méthode sera appelée par la méthode init
de la classe principale.getResource
de java.lang.class
(donc utilisable par n'importe quelle classe via le champ class
), pour charger les images, ce qui fonctionne à la fois lors que ces images sont accessibles via le CLASSPATH ou dans l'archive .jar
de l'applet. Dernière mise à jour : 02/04/2009 à 23:00 |