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.
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… 🩹
🖥 TODO
- Créez une classe
ToolBar
qui va contenir tous les boutons de l’interface, et qui se chargera de les instancier. Modifiez la classePaintApplication
en conséquence.- Toutes les classes sont pour l’instant dans le même et unique package
drawing
. Créez les packagesdrawing.shapes
,drawing.ui
,drawing.handlers
. Déplacez les classes dans les bons packages.
Voilà qui a un peu plus d’allure ! 👔
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 classeButtonFactory
pourra proposer des constantes (sous forme d’attributs statiques publics) définissant la liste des valeurs que peut prendre le paramètrebuttonName
. Ce paramètre permettra à la méthodecreateButton
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 laButtonFactory
, qui pourra prendre 2 valeurs possibles (définies dans des constantesICONS_ONLY
etTEXT_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 !
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é ?