IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Lire une zone de texte ligne par ligne sous JavaFX


Sujet :

JavaFX

  1. #1
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut Lire une zone de texte ligne par ligne sous JavaFX
    Bonjour,

    Dans une fenêtre JavaFX, j'ai créé une zone de texte (TextArea) et un bouton "écrire". Ce bouton écrire déclenche la méthode ecrire(), dont voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    		String monTexte = zoneText.getText();
     
    		try {
    			File f = new File("texte.dat");
    			FileWriter fw = new FileWriter(f);
    			BufferedWriter bw = new BufferedWriter(fw);
     
    			bw.write(monTexte);
     
    			bw.close();
    			fw.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    Tout fonctionne parfaitement à un détail près : les retour à la ligne ont disparu ! Tout est aligné en une seule ligne. Or, je veux conserver les retour ligne, parce qu'ils sont signifiants : il s'agit de données qui donnent lieu à des calculs, chaque ligne formant une entité séparée.

    Comment puis-je reproduire le contenu de ma TextArea à l'identique dans le fichier cible ? Y a-t-il un autre composant JavaFX plus adapté, genre "text editor", qui prendrait en compte les retours à la ligne ?

    Merci de vos suggestions, et à bientôt !

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Et, euh, tu es sous Windows ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par bouye Voir le message
    Et, euh, tu es sous Windows ?
    Oui, je suis sous Windows, mais j'espère que ce n'est pas ce qui fait que la fin de ligne n'est pas perçue dans le TextArea. Un programme Java est censé fonctionner pour n'importe quel système d'exploitation. J'ai configuré Eclipse pour qu'il soit encodé en UTF-8 (et non en encodage Windows), mais il n'y a peu-être pas de rapport...

    Mais existe-t-il un moyen de lire la textArea ligne par ligne ?

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je ne suis pas sur que tu ais compris le sens de ma question (voir le lien qui était inclus dans la phrase).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    J'ai bien compris la question, j'ai bien vu le lien. Mais que proposes-tu pour contourner ce problème ? A ton tour, comprends-tu bien qu'un programme Java doit s'adapter à tous les environnements (write once, run everywhere) ?
    Le texte à envoyer au fichier texte vient d'un composant JavaFX : TextArea. A ma connaissance, ce composant n'est pas estampillé "Windows". L'encodage de caractères de l'application n'est pas Windows non plus... Alors, que faire ? Me montrer les turpitudes de Windows ne me sert à rien, ça ne m'aide pas à avancer...

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    La propriété système line.separator te permet de récupérer le séparateur de ligne de l'OS sous-jacent.

    Je ne nie pas qu'il y a peut-être un soucis MAIS tu t'es immédiatement focalisé sur TextArea. Or, as-tu seulement fait des tests sans interface graphique pour savoir si juste écrire des blocs de texte dont les lignes se terminent par \n ne posaient exactement pas le même soucis ? Ce qui, si jamais cela se produit, aurait vite mis en évidence que le problème n'est pas forcément lié à ton UI mais peut-être à la manière dont tu écris des fichiers textes. De même as-tu vérifié dans un autre éditeur que notepad / le bloc-note que tu pouvais lire tes fichiers correctement (il y en a pléthore sous Windows qui supportent très bien les deux formats de fin de ligne ou qui permettent de faire la conversion de l'un à l'autre).

    Si le soucis vient de là, hé bien la réponse est facile : avant d'écrire le fichier, tu substitues tes \n par le caractère / la chaîne approprié(e) et basta.

    Faites des tests les gens, soyez un peu curieux de temps à autres .
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    C'est étonnant de devoir rentrer du texte avec des caractères d'échappement quand on écrit dans une TextArea. Je suis étonné qu'il n'y ait pas de solution en traitant la chaîne de caractère récupérée par le getText().

    De plus, ça me pose un problème : ce que je mets dans mes TextArea sont des tableaux générés par un autre logiciel, dont je ne connais pas le fonctionnement interne. Ce que je sais, c'est qu'on peut récupérer ces tableaux sous un format texte avec Ctrl+C (je ne sais même pas où se trouvent les fichiers temp qui les renferment), et j'obtiens les champs séparés par des ";", comme pour un fichier CSV... Ce que je fais donc, c'est de copier-coller chacun de ces tableaux dans une textArea. Un bouton "calculer" permet ensuite de récupérer le contenu et de procéder aux calculs.

    Tout ça pour dire que je peux traiter les lignes et les colonnes de mes tableaux, mais je n'ai pas de contrôle sur le retour ligne. L'idéal c'est de savoir comment sont faits ces fichiers (il y en a deux, deux tableaux avec des données de types différents, donc deux TextArea), mais impossible de savoir où ils sont. De plus, il s'agit très certainement de fichiers temporaires...

    C'est embêtant ! L'idée, ce serait d'agir en aval, en récupérant le texte collé dans la TextArea. Je suis vraiment très étonné qu'il n'y ait pas de solution...

    De plus, je ne vois pas bien le genre de tests que je pourrais faire... Si j'avais les fichiers texte originaux, j'agirais directement dessus : il est très facile de lire un fichier ligne par ligne, avec un readLine(). Si j'avais un moyen de savoir à quoi ressemble le retour ligne, que devrais-je faire ? un split() pour obtenir chaque ligne dans un tableau ? Ça complique énormément la chose, étant donné que je fais la même chose pour chaque ligne, qui représente un tableau dont chaque élément est séparé par un ";". Je précise que chaque fois que je peux faire des tests, je les fais. Mais c'est un peu pour ça que je poste : je ne vois pas bien quel genre de test je pourrais faire, ni en quoi ça va m'avancer...

    A+

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    String.replaceAll() au moment de l'export !

    Ton texte est copié-collé depuis un autre soft ? Donc tu peux tester de le récupérer dans un autre logiciel et voir quels caractères sont en fin de ligne. De plus placer un écouteur sur la propriété text de TextArea permettrait justement de voir ce qui arrive quand tu fais coller et donc de comparer avec ce que tu devrais recevoir (et donc faire des modifs si besoin).

    De plus, est-ce donc si dur de faire un test du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    final String text1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nAliquam suscipit ultrices magna, eu commodo ante.\nInteger blandit nulla aliquam, viverra lorem in, accumsan eros.\n";
    final String text2 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\nAliquam suscipit ultrices magna, eu commodo ante.\r\nInteger blandit nulla aliquam, viverra lorem in, accumsan eros.\r\n";
    final String[] texts = new String[]{text1, text2};
    IntStream.range(0, texts.length)
            .forEach(index -> {
                final String filename = String.format("texte%d.dat", index);
                final String monTexte = texts[index];
                final File f = new File(filename);
                try (final FileWriter fw = new FileWriter(f);
                        final BufferedWriter bw = new BufferedWriter(fw)) {
                    bw.write(monTexte);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            });
    D'ailleurs, tu ne nous a toujours pas dit avec quel logiciel tu lis tes fichiers dat et encore moins si tu as bien vérifié que ces retours à la lignes sont manquants (c'est a dire que le caractère de retour à la ligne est absent du fichier) ou si c'est juste ton logiciel de lecture de fichier texte qui n'est pas capable d'afficher des \n.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Merci pour ces conseils, je vais essayer de suivre tes conseils. Je n'ai lu pour l'instant ton message qu'assez rapidement, mais je souhaite répondre à ta question : si je n'ai pas donné de détails, c'est qu'il me semble que cela risque de rendre mon propos plus confus, au lieu de l'éclaircir. Mais puisque tu y tiens :

    Le logiciel avec lequel j'ouvre ces tableaux est le logiciel d'astrologie Azimut35. Il s'agit du tableau d'éphémérides, qui donne un certain nombre de données sur chaque planète. La seule colonne qui m'intéresse est la colonne "Domitude". L'autre tableau est le tableau des aspects entre les différentes planètes. Mon projet est de calculer, d'après ces données les dominantes planétaires d'un thème astral. Cela prend en compte les aspects et les angularités (la domitude). Chaque aspect donne des points, et la position en maison (domitude) aussi. Une simple addition permet donc d'établir une hiérarchie du thème.

    Si je copie-colle les tableaux sur un simple bloc-notes, ou même directement en ouvrant le fichier texte sous éclipse, mon projet est finalisé, et m'établit la liste des dominantes planétaires sans problèmes. Mais il faut agir sur les fichiers texte. Ce que je souhaite, c'est faire le copier-collé sur une interface graphique, qui réécrit dans les fichiers texte, avec un FileWriter. Mais là, aucun moyen d'utiliser un readLine().

    Voilà pour les précisions. A présent, si tu veux voir mon code, je ne sais pas si cela ajoutera à la confusion de mon explication...

    En fait, mes fichiers .dat, je les crée sous Eclipse, je les lis avec n'importe quel éditeur de texte. Ils ont bien un retour ligne. Ils sont parfaitement lisibles par mon projet JavaFX. Lorsque j'utilise ces fichiers .dat (ça pourrait être .txt ou .bidule), pour y coller directement les contenus des tableaux en question par copié-collé, il n'y a aucun problème, et le résultat est parfait. C'est leur écriture qui est problématique : le retour à la ligne de la TextArea n'est pas répercutée par ma méthode write(). Je voudrais en effet écrire mes fichiers .dat depuis l'interface de mon projet. J'ai pensé que deux TextArea seraient idéales.

    En attendant, je vais relire ta réponse et voir si je peux effectuer le test... A tout à l'heure.

  10. #10
    Membre régulier Avatar de Markos22
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2016
    Messages : 198
    Points : 84
    Points
    84
    Par défaut
    Re-Bonjour,

    En fait, mon problème venait non pas du fait que je n'ai pas fait assez de tests, mais, d'une certaine façon, pour le dire de façon un peu provocatrice, parce que j'en faisais trop, ou plus exactement, pas les bons : mes fichiers texte, générés par les TextArea, ont bien un retour ligne, visible par mon programme mais invisible quand j'ouvre les fichiers avec le bloc-note. Il m'a suffit de faire une lecture de chaque ligne des fichiers .dat par un simple affichage en console (System.out.println()), pour me rendre compte que la console affichait bien le retour à la ligne.

    J'ai été trop prudent, et j'ai voulu regarder les fichiers .dat dans le bloc-notes, avant de les traiter par le programme. Mais le programme, lui, voit bien un retour ligne (semble-t-il), qui ne lui pose apparemment pas de problème. Encore quelques tests à effectuer, et la finalisation du programme, et le sujet pourrait bien être résolu.

    C'est un peu trop beau pour être vrai, je vais faire les vérifications nécessaires, et je reviens pour marquer cette discussion comme résolue.

    ...

    Incroyable mais vrai ! Ça maaAAarche !!!!

    Conclusion et morale de l'histoire : Lorsque l'on ouvre un fichier texte avec un bloc-notes, il se peut que les retours à la ligne n'apparaissent pas, mais ils sont pourtant présents. Il faut alors tester le ligne à ligne dans la console, pour être sûr. L'écriture d'un fichier avec un programme Java et son ouverture dans le bloc-notes ne donnent pas de résultat cohérent : ce qui est écrit par le programme doit être lu par le programme.

    Merci à tous, et à bientôt !

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Le bloc-note fait partie de ces programmes qui ne gèrent pas du tout le retour à la ligne façon UNIX ; c'est aussi simple que cela.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/03/2016, 19h48
  2. Réponses: 3
    Dernier message: 13/12/2006, 14h03
  3. Modifier une zone de texte désigné par la fonction eval(concat de variables)
    Par Franck2mars dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 19/07/2006, 11h43
  4. Taille d'une zone de texte dans un état sous Access 2003
    Par Petite grenouille dans le forum Contribuez
    Réponses: 4
    Dernier message: 15/05/2006, 19h39
  5. Réponses: 2
    Dernier message: 19/01/2006, 19h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo