TP4.md 4.5 KB

Minipaint

TP4 – On continue...

📟 Retour visuel


Dans la partie précédente, on a implémenté une fonctionnalité permettant de sélectionner plusieurs formes à la fois.

🖥 TODO

  • Modifiez la classe StatutBar pour qu’elle affiche aussi le nombre de formes sélectionnées.


🔕 Problème : le nombre de formes sélectionnées ne se met pas à jour automatiquement. C’est normal, puisque les observateurs du DrawingPane sont avertis lorsqu’une forme est ajoutée ou supprimée, mais pas quand une forme est sélectionnée.

🖥 TODO

  • Proposez une solution pour que les observateurs du DrawingPane soient aussi avertis lorsque la sélection change. Attention, veillez à respecter le principe de la responsabilité des classes...
  • Implémentez la solution.
  • Écrivez les tests nécessaires.


🗑 Suppression de forme


Grâce à la sélection multiple, on peut donc appliquer des actions sur toutes les formes sélectionnées. On a déjà implémenté le déplacement multiple. Continuons avec la suppression de forme(s).

🖥 TODO

  • Ajoutez les classes nécessaires et un bouton dans l’interface.
  • Écrivez les tests correspondants.

🪲 Oui mais… il reste un « bug » : lorsqu’on supprime une ou plusieurs forme(s), la liste des formes sélectionnées n’est pas vidée !

🖥 TODO

  • Corrigez cela…


🗄 Un peu de rangement


🖥 TODO

  • Créez une classe ToolBar qui va contenir tous les boutons de l’interface, et qui se chargera de les instancier. Modifiez la classe PaintApplication en conséquence.
  • Toutes les classes sont pour l’instant dans le même et unique package drawing. Créez les packages drawing.shapes, drawing.ui, drawing.handlers. Déplacez les classes dans les bons packages.

Voilà qui a un peu plus d’allure ! 👔


🏭 Une fabrique « simple »


On voudrait remplacer le texte sur les boutons par des icônes. Chaque action aura son icône dédiée, et le texte deviendra une info-bulle sur le bouton. Cherchez comment ajouter une image sur un objet de type Button dans l’API JavaFx.

Vous pourrez récupérer des icônes libres de droit sur https://material.io/tools/icons

🖥 TODO

  • Dans la classe ToolBar, rajoutez les lignes de code nécessaires à l’ajout d’image pour chaque bouton.


Vous remarquez que la création de chaque bouton fait intervenir les mêmes lignes de code redondantes. C’est là qu’intervient la Fabrique « simple ». Ce n’est pas vraiment un patron de conception, mais plutôt une bonne pratique.

L’idée consiste à regrouper l’instanciation des boutons dans une seule classe ButtonFactory, qui sera donc notre « usine » à boutons. Cette classe contiendra une méthode :

public Button createButton(String buttonName)

🖥 TODO

  • Créez cette classe et implémentez la méthode createButton. La classe ButtonFactory pourra proposer des constantes (sous forme d’attributs statiques publics) définissant la liste des valeurs que peut prendre le paramètre buttonName. Ce paramètre permettra à la méthode createButton de déterminer quelle image doit être chargée, et quel texte doit être mis dans l’info-bulle.
  • Dans la ToolBar, faites maintenant appel à cette fabrique pour obtenir les instances de boutons dont vous avez besoin.


Maintenant, on voudrait qu’il soit toujours possible de créer des boutons sans icone, avec seulement du texte.

🖥 TODO

  • Pour cela, rajoutez un paramètre style au constructeur de la ButtonFactory, qui pourra prendre 2 valeurs possibles (définies dans des constantes ICONS_ONLY et TEXT_ONLY).
  • Modifiez la méthode createButton pour qu’elle instancie les boutons et les configure de la manière voulue, en fonction du style défini lors de l’instanciation de la fabrique.
  • Testez !


🏗 Mais alors, le patron « Factory Method », qu’est-ce que c’est-y donc ?


Pour plus de détails sur ce patron, suivez la vidéo de Christopher Okhravi 📺

En fait, ce patron est déjà présent dans l’application, et vous l’avez utilisé sans vous en rendre compte… 🥷

🖥 TODO

  • Observez la classe ShapeButtonHandler et les classes qui en héritent. Un petit diagramme de classes pourra vous aider…

Alors, vous avez trouvé ?


🔙 Retour