On veut ajouter un certain nombre de fonctionnalités au programme de dessin, mais sans rajouter trop de méthodes aux classes qui forment le dessin lui-même. Par exemple, on a défini un format très simple de sauvegarde des dessins :
Chaque forme est listée sur une ligne, avec son type et les coordonnées des composants. Pour un cercle : son centre puis son rayon ; pour un segment, les coordonnées de ses deux extrémités, le tout séparés par des espaces.cercle 30.0 10.2 5.0 segment 5.0 0.0 10.0 20.0 segment 0 0 100 100Le chargement ne pose pas de problème majeur. Mais pour la sauvegarde, on a besoin de savoir à quel type de forme on a affaire pour pouvoir accéder à ses données. Pour cela, on va définir un visiteur :
public interface FormeVisiteur { void visitCercle(Cercle c); void visitSegment(Cercle s); }Et ajouter à chaque forme la méthode
accept(FormeVisiteur v)
qui lui correspond.
De plus, dans SimpleDrawAppli
, nous ajoutons les deux méthodes suivantes :
public void ouvrirFichier() { try { JFileChooser fileChooser = new JFileChooser(); int res = fileChooser.showOpenDialog(frame); if (res == JFileChooser.APPROVE_OPTION) { File file = fileChooser.getSelectedFile(); // Pour pouvoir utiliser la classe Files, et ses méthodes simplifiées: Path path = file.toPath(); Listça n'est probablement pas le meilleur endroit, mais je vous laisse améliorer la structure du code après coup.lignes = Files.readAllLines(path, Charset.forName("utf-8")); // ... votre code } } catch (IOException e) { throw new RuntimeException(e); } } public void sauverFichier() { try { JFileChooser fileChooser = new JFileChooser(); int res = fileChooser.showSaveDialog(frame); if (res == JFileChooser.APPROVE_OPTION) { File file = fileChooser.getSelectedFile(); // Pour pouvoir utiliser la classe Files, et ses méthodes simplifiées: Path path = file.toPath(); // L'objet pour pouvoir écrire nos données... Writer w = Files.newBufferedWriter(path, Charset.forName("utf-8")); // ... votre code w.close(); } } catch (IOException e) { throw new RuntimeException(e); } }
En utilisant le pattern Visiteur pour la méthode sauverFichier, complétez le code des deux méthodes.
Dans un premier temps, on supposera que quand on sauvegarde un groupe, on ne sauve que les formes qu'il contient, pas le groupement lui-même. Vous pourrez ensuite réfléchir à une modification du format de fichier pour gérer correctement les groupes
Pour créer des groupes: ajouter à votre vue la notion de selection. Une sélection est un ensemble de formes. Ajoutez un outil "selectionneur", ou, si vous préférez, modifiez l'outil de déplacement pour que :
isShiftDown()
de MouseEvent.
Ajoutez un bouton "normal" à la barre des boutons, qui exécutera une commande créerGroupeCommande. Cette commande :