Path: csiph.com!feeder.erje.net!1.eu.feeder.erje.net!news.albasani.net!news.trigofacile.com!.POSTED.reverse-90.fdn.fr!not-for-mail From: Yliur Newsgroups: fr.comp.lang.java Subject: Re: Aide pour une =?UTF-8?B?c3RyYXTDqWdpZQ==?= de programmation. Date: Wed, 15 Nov 2017 09:57:22 +0100 Organization: Groupes francophones par TrigoFACILE Message-ID: <20171115095722.5d432934@free.fr> References: <59fc966a$0$20429$426a34cc@news.free.fr> <20171107150354.5dc0969f@free.fr> <5a03af3a$0$7158$426a74cc@news.free.fr> <20171109091546.54256f71@free.fr> <5a06ff9f$0$3443$426a34cc@news.free.fr> <20171111183357.7277d116@free.fr> <5a0a6560$0$3841$426a74cc@news.free.fr> <20171114122759.223fae94@free.fr> <5a0bc677$0$3851$426a74cc@news.free.fr> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Injection-Info: news.trigofacile.com; posting-account="yliur@free.fr"; posting-host="reverse-90.fdn.fr:80.67.176.90"; logging-data="28211"; mail-complaints-to="abuse@trigofacile.com" X-Newsreader: Claws Mail 3.15.1-dirty (GTK+ 2.24.31; x86_64-pc-linux-gnu) Xref: csiph.com fr.comp.lang.java:1606 Le 15 Nov 2017 04:45:43 GMT bloiiing a écrit : > Je viens de comprendre ce que tu veux dire par séparer les données de > l'inteface graphique. Ou du moins je pense avoir compris l'idée. > > Comment t'y prendrais-tu pour sauver les textes? Dans des String, des > JTextArea, des Vector de String ou autres? Moi je les sauvegardais > dans des JTextPane mais je viens de comprendre que si je veux > effectuer un traitement sur ces données ce sera plus compliqué que > sur des String ou des Vector. C'est bien ça. Les JTextPane sont des objets graphiques, il vaut mieux les utiliser pour les représentations graphiques mais pas pour du stockage de données, ce sera plus simple et plus clair. Je vais essayer de détailler/expliquer ce sur quoi j'étais parti au début. Il faut d'abord définir des classes permettant de stocker les données, on ne s'intéresse pas à leur représentation graphique à ce niveau. Donc on aurait par exemple une classe Chapitre définie comme ça (c'est simplifié, tu auras sans doute plus d'éléments) : public class Chapitre { private String titre ; private String corps ; } Il doit y avoir d'autres concepts manipulés par ton programme, c'est le moment d'en faire une liste (c'est toujours utile) : des personnages, des lieux, ... ? Quelles sont les notions qui vont être manipulables ? En as-tu une liste ? Ensuite on va avoir une fenêtre pour représenter graphiquement une liste de chapitres et un chapitre en cours d'édition. Ici aussi c'est simplifié pour l'instant. La classe devrait ressembler à ça (pour les composants graphiques, j'utilise une convention consistant à indiquer leur type, puis un souligné puis leur nom ; pratique parce qu'il y a deux informations importantes dans les composants graphiques) : public class FenPrincipale extends JFrame { private JList liste_chapitres ; private JTextField txt_titreChapitreEdite ; private JTextPane zonetxt_corpsChapitreEdite ; } Note que JList est un composant graphique permettant de représenter une liste visuellement et d'interagir avec elle, alors que plus haut List permet simplement de stocker des données (les chapitres), sans se préoccuper de représentation visuelle. Et pour lier le tout, on aura une classe référençant les éléments principaux de l'application. Elle peut ressembler à ça : public class Application { private List chapitres ; private FenPrincipale fenPrincipale ; } Note que les chapitres et autres données à venir pourraient être regroupées dans une classe DonneesAppli, elle-même référencée dan Application, mais on verra plus tard quand ça s'étoffera. Côté fenêtre c'est pareil : on va sans doute avoir des panneaux et autres, pas juste trois composants posés directement dedans, mais on verra ça plus tard aussi, ce n'est pas nécessaire pour cette explication . Pour le rangement en revanche mieux vaut bien séparer les choses, ça permet de mieux saisir leur rôle. Si src est le répertoire contenant tes sources, ça peut se présenter comme ça : src donnees Chapitre interfacegraphique FenPrincipale traitements ... (ici les chargements/sauvegardes par exemple) Application Je te laisse nommer les choses à ta convenance, tout ça n'est qu'un exemple. Ça c'est pour la base de l'organisation des données, c'est très important que ce soit clair. Maintenant un aperçu du fonctionnement de l'ensemble, tu me diras si c'est clair... L'idée générale est celle-ci : Fichier <- chargement/sauvegarde -> Données <- édition-> Fenêtre Les étapes importantes : - À partir d'un fichier on charge les données en mémoire (classe Chapitre : il y aura un objet par chapitre). La JList de la fenêtre est à ce moment remplie aussi avec les chapitres (on verra plus tard comment la synchroniser avec la liste de chapitres, je ne détaille pas ça pour l'instant). => Pour la réalisation de cette partie on verra plus tard. - Quand on clique sur un chapitre dans la liste pour l'éditer, les deux champs de saisie de la fenêtre vont être remplis avec les textes issus du chapitre. => Il y aura quelque part (en réaction à un clic sur un élément de la JList) un bout de code de la forme fenPrincipale.txt_titreChapitreEdite.setText (chapitre.getTitre()) ; fenPrincipale.zonetxt_corpsChapitreEdite.setText (chapitre.getCorps()) ; - À ce moment l'utilisateur peut éditer les textes (ici titre et corps) du chapitre dans les deux composants graphiques. Ces textes sont édités uniquement dans le composant graphique, les données du chapitre dans l'objet de la classe Chapitre ne sont pas modifiées. - À un moment ou un autre, les données éditées doivent être envoyées dans l'objet Chapitre. Là c'est un choix d'ergonomie de ta part : est-ce que l'édition de ces données doit être annulable ? Est-ce que le texte d'un chapitre peut être visible à différents endroits simultanément ? Est-ce qu'on peut faire des recherches dans le texte des chapitres ? Suivant la réponse à ces questions et quelques autres, le moment où la synchronisation sera effectuée (l'événement qui la déclenchera) sera différent. => Dans les deux cas il y aura un bout de code ressemblant à ça : chapitre.setTitre (fenPrincipale.txt_titreChapitreEdite.getText()) ; chapitre.setCorps (fenPrincipale.zonetxt_corpsChapitreEdite.getText()) ; - À un autre moment, à définir également, les données seront sauvegardées dans le fichier. => Opération symétrique du chargement depuis le fichier, à voir en même temps. Est-ce plus clair comme ça ? Pour avancer à partir de là, il faut d'une part définir les autres données manipulées par l'application (personnages, ... ?), les informations qui les composent (j'ai juste noté titre et corps dans les chapitres, mais il y a sans doute d'autres choses) ; d'autre part définir à quel moment les textes sont synchronisées entre les composants graphiques et les données de l'application. Pour cette deuxième partie, il y a plusieurs solutions possibles, à voir en fonction de ce que fait le reste de l'appli ; pour l'instant on pourrait se contenter de copier les données des composants graphiques dans les données de l'appli quand on passe à un autre chapitre, c'est simple à mettre en œuvre et c'est un bon exemple ; il sera toujours temps de changer d'avis quand tu auras bien compris le principe de fonctionnement. Dis-moi si le fonctionnement général te paraît plus clair ou si tu as des questions...