Cours de Programmation avancée


TP 3 : Adapter

Dessin de camion

Consignes pour démarrer le TP

Comme pour les TP précédents, on va utiliser git pour la gestion de versions et vous allez devoir cloner un dépôt pour ce projet. Il vous faut donc vous reporter aux consignes du premier TP.

Lien vers le projet gitlab à forker pour le TP : https://etulab.univ-amu.fr/alaboure/graphic.

Une fois le dépôt téléchargé, vous pouvez compiler et exécuter le programme en cliquant deux fois sur graphic -> application -> run. Vous devriez obtenir l’affichage suivant.

image

Objectifs

Dans cette planche de TP, vous allez implémenter des classes pour réaliser des dessins de camion. Nous vous donnons une classe (classe Truck du package viewer) permettant de dessiner le camion suivant :


Le code de cette classe est le suivant :

public class Truck extends Canvas{
    public Truck() {
      super(650, 550);
      GraphicsContext graphicsContext = this.getGraphicsContext2D();
      Painter painter = new FrenchPainter(graphicsContext);
      draw(painter);
    }
    
    private void draw(Painter painter) {
      painter.drawRectangle(50.0, 50.0, 350.0, 350.0);
      painter.drawRectangle(400.0, 225.0, 200.0, 175.0);
      painter.drawCircle(200.0, 400.0, 50.0);
      painter.drawCircle(500.0, 400.0, 50.0);
    }
}

Pour le dessin, on utilise l’interface Painter suivante :

public interface Painter {
  /**
   * Draws a rectangle.
   *
   * @param xUpperLeft the X position of the upper left corner of the 
   * rectangle.
   * @param yUpperLeft the Y position of the upper left corner of the 
   * rectangle.
   * @param width the width of the rectangle.
   * @param height the height of the rectangle.
   */
  void drawRectangle(double xUpperLeft, double yUpperLeft, double width, double height);

  /**
   * Draws a circle.
   *
   * @param xCenter the X position of the center of the circle.
   * @param yCenter the Y position of the center of the circle.
   * @param radius the radius of the circle.
   */
  void drawCircle(double xCenter, double yCenter, double radius);
}

Le but est donc de dessiner des rectangles et des cercles. Pour cela il vous faudra utiliser les méthodes strokeRect et strokeOval de la classe GraphicsContext de JavaFX.

Tâche 1 : Complétez la classe FrenchPainter dans le package french qui implémente l’interface Painter. Le but est d’obtenir l’affichage ci-dessous :

image

Un anglais a développé une classe EnglishPainter qui permet de dessiner des cercles et des rectangles. L’objectif est d’utiliser la classe EnglishPainter sans la modifier. Elle possède deux méthodes utilisant la classe Point2D de JavaFX :

  • void paintRectangle(Point2D upperLeft, Point2D lowerRight) (où upperLeft et lowerRight sont les deux coins opposés du rectangle) ;
  • void drawCircle(Point2D center, Point2D point) (où center et point sont respectivement le centre et un point du cercle).

La classe EnglishPainter possède également un constructeur qui prend en paramètre une instance de la classe GraphicsContext. Nous souhaitons utiliser la classe EnglishPainter à la place de notre classe FrenchPainter en modifiant le moins possible le code déjà écrit. Nous voulons également pouvoir passer d’une version à l’autre en changeant uniquement la ligne de code :

Painter painter= new FrenchPainter(graphicsContext);

par

Painter painter = new EnglishPainterAdapter(graphicsContext);

dans la classe Truck.

Tâche 2 : Proposez une implémentation de la classe EnglishPainterAdapter qui ne demande aucune modification du code des classes déjà présentes dans le code. Le but est d’obtenir l’affichage ci-dessous :

image