Retour à la ligne JTextArea

Résolu/Fermé
ventresh - 29 août 2008 à 18:26
ventresh Messages postés 5 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 1 septembre 2008 - 1 sept. 2008 à 11:05
Bonjour,

J'ai un petit souci sur un JTextArea sur une appli Java.

J'ai défini un JTextArea acceptant les retours à la ligne setLineWrap(true). Si je saisis dedans pas de pb, le comportement est parfaitement normal.

Sauf que ce JTextArea est initialisé avec une donnée en provenance d'un objet métier, la description d'un dossier en l'occurrence qui est assez longue avec beaucoup de retours à la ligne. Ce même objet récupère les données depuis un flux XML (dans lequel d'ailleurs les retours à la ligne sont codés ), lui même construit à partir du résultat d'une requête SQL dans une BDD.

Et c'est ainsi que je constate que :
- le texte (mediumtext) stocké dans la base de données a bien des retours à la ligne
- le texte stocké dans la variable String de l'objet métier qui stocke cette info a bien des retours à la ligne (vérifié notamment dans la console après affichage par un system.out.println ;
- lorsque j'applique mon text au jtext area avec la méthode monJTextArea.setText(montextlong), le texte est bien présent dans le champ multiligne mais sans plus aucun retour à la ligne !

Or si je saisis dans le JTextArea en veillant bien à faire des retours à la ligne, que je synchronise ma saisie avec la variable texte de l'objet métier et que je remets à jiour le texte du JTextArea avec le contenu de ma variable texte de l'objet métier, mes retours à la ligne sont bien affichés.

Je récapitule (ok signifie que les retours à la ligne sont correctements transmis) :
JTextArea --- ok --> Objet métier --- ok --> JTextArea

BDD -- ok --> XML -- ok --> Objet métier -- pas ok --> JTextArea

Voilà le bout de code qui est le pont entre l'objet métier et le JTextArea
public void loadData(){
// Je récupère la valeur à afficher
Object data;
data = attribut.invokeGetter(targetObj); // peu importe la méthode de récupération de la donnée, spécifique à mon appli

// Je teste dans la console, pas de problème les retours à la lignes sont pris en compte
System.out.println(data);

//Je mets à jour le contenu textuel du composant le JTextComponent field (dans notre cas un JTextArea)
//qui, étant de type texte, est mis à jour par l'instruction du dernier bloc else
if(data==null){
//Si le getter ne retourne aucune donnée, on affiche un champ vide
field.setText("");
}
else if(data.getClass().equals(Date.class)){
//Dans le cas d'une date, on procède à son formatage "textuel"
field.setText(DATE_FORMAT.format(data));
}
else if(data.getClass().equals(Float.class)){
//Dans le cas d'un float, on procède à son formatage à 2 décimales
field.setText(FORMAT_MONETAIRE.format(data));
}else{
//Pour tout autre type, on affiche la représentation textuelle de la donnée
field.setText(data.toString());
}
}

Si quelqu'un pouvait m'éclairer. A priori, il ne s'agit pas d'un problème de fond mais d'une connerie, car la gestion des retours à la ligne fonctionne très bien lorsque la saisie enregistrée dans l'objet métier provient justement du JTextArea. C'est lorsque sa source est externe que la situation foire.

Merci.

5 réponses

ventresh Messages postés 5 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 1 septembre 2008 1
1 sept. 2008 à 11:05
Bon j'ai trouvé la réponse à mon problème, soufflée par une remarque sur un autre forum signalant que sur Windows, un retour à la ligne devait être codé par un \r\n plutôt qu'un \r tout seul.

est le code ASCII de \r. Il n'est pas interprété par l'interface Swing sur Windows. J'ai donc modifié mon code dans ma méthode load de telle manière à remplacer tous les \r par des \n et ça marche.

Voilà donc la solution au problème :
...
}else{
//Pour tout autre type, on affiche la représentation textuelle de la donnée
field.setText(data.toString().replaceAll("\r", "\n"));
}
1
Merci pour ta remarque, j'ai donc essayé mais sans effet. Pire, voilà le code que j'ai corrigé pour tester :
...
else{
//Pour tout autre type, on affiche la représentation textuelle de la donnée
field.setText(data.toString());
if(field instanceof JTextArea){
((JTextArea) field).setLineWrap(true);
((JTextArea) field).setWrapStyleWord(true);
System.out.println(field.getText());
}
}

Résultat : à l'affichage sur l'UI, toujours pas de retours à la ligne mais en revanche, dans la console, je demande à afficher le contenu du JTextArea fraîchement mis à jour et là surprise : j'ai bien des retours à la ligne.
Donc le texte du JTextArea a bien des retours à la ligne mais c'est son affichage qui ne les prend pas en compte.

Sachant que j'ai sur le champ un écouteur sur le focus qui charge le texte en provenance de l'objet métier lorsque le focus est donné au JTextArea et qui récupère le texte saisi dans le JTextArea vers l'objet métier lorsque le focus est perdu.

Du coup, lorsque je charge le texte dans le JTextArea, les retours à la ligne semblent perdus. Je les retape et sort du JTextArea, ils sont bien pris en compte. Si je reprends le focus, ils sont bien apparents dans l'affichage ce qui veut dire que les retours à la ligne provenant de ma saisie dans le JTextArea sont correctement interprétés.

mais chose intéressante, lorsque je consulte le texte affiché dans la console grâce au System.out.println, mes lignes sont séparés dorénavant d'un double retour : l'initial + celui ajouté par saisie dans le JTextArea alors que dans le JTextArea, seul le dernier retour à la ligne est affiché !!!
0
ventresh Messages postés 5 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 1 septembre 2008 1
1 sept. 2008 à 09:49
Voilà le texte obtenu par la méthode field.getText() tel qu'il s'affiche dans la console :

- Poursuivre une communication de proximité, qui va au contact des habitants (journaux, affiches, journées portes ouvertes, manifestations festives), où l'image et la rencontre sont privilégiées.

- la pluralité des instances de concertation Echirolloise (lieux de proximités-Maison des habitants, Maison de la solidarité et des initiatives citoyennes, groupes de travail thématiques, comités de quartiers, assises de la ville), nous amène aujourd'hui à développer un nouveau support de communication « Cité Citoyens », dont le référentiel « faire ensemble » restituera les pratiques utilisées en présence des trois partenaires de la participation « habitants, élus, techniciens ».

- développer des ateliers multimédia, afin de toucher le public jeune aujourd'hui absent de nos concertation. Hermétique à nos supports de communication traditionnel (bulletin municipal, presse locale), les jeunes sont déjà pratiquement tous connectés à Internet et n'ont aucune difficulté face à l'ordinateur.

- pour répondre à la forte demande d'information sur le développement durable, et pour toucher un public non initiés, différentes formes d'information seront déclinées (expositions pédagogiques, des visites de sites exemplaires, des conférences débats, des films) afin de sensibiliser les habitants pour que chacun se sente concerné et impliqué dans la démarche agenda 21.

Voilà la copie d'écran du texte tel qu'il s'affiche sur l'UI :
http://www.novasubv.fr/img/jTextArea.png
0
ventresh Messages postés 5 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 1 septembre 2008 1
1 sept. 2008 à 09:54
Et voilà le texte tel que je le récupère dans le flux XML retourné par le serveur d'application en charge d'interroger la BD (retours à la ligne codés - j'ai remplacé le # par un $ pour pas qu'il soit interprété sur le forum) :

<contenu>- Poursuivre une communication de proximité, qui va au contact des habitants (journaux, affiches, journées portes ouvertes, manifestations festives), où l'image et la rencontre sont privilégiées. &$13;&$13;- la pluralité des instances de concertation Echirolloise (lieux de proximités-Maison des habitants, Maison de la solidarité et des initiatives citoyennes, groupes de travail thématiques, comités de quartiers, assises de la ville), nous amène aujourd'hui à développer un nouveau support de communication « Cité Citoyens », dont le référentiel « faire ensemble » restituera les pratiques utilisées en présence des trois partenaires de la participation « habitants, élus, techniciens ».&$13;&$13;- développer des ateliers multimédia, afin de toucher le public jeune aujourd'hui absent de nos concertation. Hermétique à nos supports de communication traditionnel (bulletin municipal, presse locale), les jeunes sont déjà pratiquement tous connectés à Internet et n'ont aucune difficulté face à l'ordinateur. &$13;&$13;- pour répondre à la forte demande d'information sur le développement durable, et pour toucher un public non initiés, différentes formes d'information seront déclinées (expositions pédagogiques, des visites de sites exemplaires, des conférences débats, des films) afin de sensibiliser les habitants pour que chacun se sente concerné et impliqué dans la démarche agenda 21.&$13;&$13;</contenu>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
29 août 2008 à 19:59
Bonsoir,

As -tu essayé de mettre un setLineWrap(true) juste après ton field.setText()?
-1