TP Programmation par objets - Java, Licence Informatique, Sept-Déc 2004, Université de Montpellier II

Enseignant resp : Jacques Ferber,ferber@lirmm.fr

 

TP 7: Dessin et évènement

 

1. Dessin

Dans cette partie nous allons définir une hiérarchie de classe modélisant un ensemble d'objets graphiques élémentaires.

Exercice 1: Ecrire le code des différentes classes nécessaires à l'implémentation de la hiérarchie suivante :

Avec les méthodes (on utilisera la classe java.awt.Point pour représenter des points):

   - Dans la classe Figure (Figure sera considérée comme une classe abstraite) :

Figure(), constructeur vide.
void setColor(Color c), fixe la couleur de l'objet.
String getName().
Color getColor().
void draw(Graphics g), qui dessine l'objet dans g.
boolean contains(int x,int y), vrai ssi l'objet contient le point (x,y).

    - Dans la classe Line :

Ligne() et Ligne(int x1, int y1, int x2, int y2), pour les constructeurs.
void setExtremity1(Point p),
void setExtremity2(Point p),
Point getExtremity1().
Point getExtrimity2().

    - Dans la classe Rectangle :

Rectangle() et Rectangle(Point pos,int w,int h).
void setLocation(Point p), change la position du sommet en haut à gauche.
void setDimension(int w, int h), change les dimensions du rectangle.
Point getLocation().
int getWidth().
int getHeight().

- Dans la classe Circle :   

Circle() et Circle(Point c,int r).
void setLocation(Point p), change la position du centre du cercle.
void setRayon(int r), change le rayon.
Point getLocation().
int getRayon().

Note: a)les méthodes draw() et contains() doivent être réécrites dans chacune des classes Line, Rectangle et Circle pour pouvoir tenir compte des spécificités et des paramètres de ces figures géométriques.
b) dans un premier temps la méthode contains() de Line retournera systématiquement false.

Exercice 2:  Créer une application TestGraphic, héritant de JFrame. Créer un composant DrawComponent, inscrit dans TestGraphic, qui affiche 3 cercles et un rectangle, dont voici les caractéristiques :
Circle1 x = 200,y = 200,r = 100 ;
Circle2 x = 160,y = 150,r = 20 ;
Circle3 x = 240,y = 150,r = 20
et le Rectangle x = 150,y = 220,w = 100, h = 40. (voir 3.0)

2 Evénements

Exercice 3: Ajouter à la classe TestGraphic la méthode changeColor(ObjetGraphique o) qui change la couleur de l'objet graphique o en lui attribuant la couleur suivant la sienne dans la liste circulaire : ( Color.black, Color.blue , Color.cyan, Color.red, Color.green, Color.magenta, Color.orange, Color.yellow )

Exercice 4: Modifier l'application TestGraphic pour capturer les évènements de la souris (voir 3.4). Chaque click de l'utilisateur dans l'un des objets graphiques doit provoquer un changement de couleur de l'objet pointé.

Exercice 5: Créer un dialogue (un dialogue est simplement une classe de type JDialog qui se manipule comme s'il s'agissait d'une JFrame) qui permette d'entrer des paramètres (couleur, taille) permettant de construire des lignes, des cercles et des rectangles. Donnez la possibilité de pouvoir créer directement de telles figures à l'aide de boutons "Rectangle", "Ligne" et "Cercle". Lorsque vous cliquez sur un de ces boutons et qu'ensuite vous cliquez sur le DrawComponent, alors une figure de l'un de ces types est affichée à l'endroit où vous venez de cliquer.

Exercice 6: Donnez la possibilité de bouger les figures. Pour cela récupérer la figure dans laquelle vous avez cliqué (méthode contains définie plus haut). Utilisez ensuite un listener de type MouseMotionListener qui gère les déplacements de la souris.

3 Rappels

3.1 La classe Graphics : cette classe fournit des méthodes permettant de dessiner dans une fenêtre graphique.
Vous devez importer la librairie awt avec : import java.awt.*;

Voici quelques exemples d'appel de méthodes: soit g une instance de Graphics :

    - pour tracer une ligne reliant les points (x1,y1) et (x2,y2):   g.drawLine(x1,y1,x2,y2);
    - pour dessiner un rectangle à la position (x,y) , sommet supérieur gauche, de largeur w et de hauteur h:                            g.drawRect(x,y,w,h);
    - pour dessiner un cercle de centre (X,Y) et de rayon R :  g.drawOval(X-R, Y-R, R*2, R*2);
    - pour changer la couleur du prochain dessin :   g.setColor(Color.white); //Color.white est la couleur blanche

3.2 Un cercle (X,Y) de rayon R, contient un point (x,y) ssi : ((x-X)²+(y-Y)²) <= R²


Site des infos concernant le module de programmation par objets en licence:
http://www.lirmm.fr/~ferber/Licence