Mise a jour de la vue dans un JTextArea

Mise a jour de la vue dans un JTextArea - Java - Programmation

Marsh Posté le 19-05-2005 à 20:11:35    

Salut, voila j'ai redirigé la sortie standard vers le JTextArea de ma fenetre ... donc le texte se rajoute au fur et a mesure vers le Bas, le probleme c'est que je n'arrive pas a mettre a jour la vue ... cad comme si on descendais le scrollbar a chaque insertion de texte dans le JTextArea pour voir "effectivement" le texte rajouté.
 
Quelqu'un a til un conseil svp ?


Message édité par Chronoklazm le 19-05-2005 à 20:12:47

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 19-05-2005 à 20:11:35   

Reply

Marsh Posté le 19-05-2005 à 20:41:20    

Voila le code ... :
 

Code :
  1. /** Redirection de la sortie standard vers le JTextArea */
  2.     public static void redirStdOut(final JTextArea interactions){
  3. //input=input+new String(b,0,b.length);  
  4. OutputStream  stdOutStrm =
  5.         new OutputStream() {
  6. boolean saut = false; // détection des \n\r
  7. String buf = "";      // le buffer final a rajouter
  8. //Redefinition de la methode write de OutputStream
  9. public void write(int b) throws IOException {
  10.     char a = (char) b;
  11.     if (a == '\r') this.saut = true;
  12.     else {
  13.          if ((this.saut) && (a != '\n')){
  14.           String ch = interactions.getText();
  15.   if (ch.indexOf("\n" ) < 0) {
  16.           interactions.replaceRange("", 0, ch.length());
  17.                 } else
  18.          interactions.replaceRange("", ch.lastIndexOf("\n" )+1, ch.length());
  19.        }
  20.         buf = buf+String.valueOf(a);
  21.         this.saut = false;
  22.     }
  23.     if ((a == '\n') || (a == '\r')) {
  24.         interactions.append(buf);
  25.         buf = "";
  26.     }
  27.        }
  28.    };
  29. System.setOut(new PrintStream(stdOutStrm));


 
Une idée, un conseil ... un avis ?


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 19-05-2005 à 21:57:38    

Moi je dis UP !


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 20-05-2005 à 00:33:57    

Et aussi je dis :
 
Suffit de rajouter :

Code :
  1. interactions.setCaretPosition((interactions.getText()).lastIndexOf("\n" )+1);


juste apres

Code :
  1. interactions.append(buf);


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 20-05-2005 à 02:59:57    

pourquoi pas simplement un setCaretPosition(txt.length()) ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 20-05-2005 à 03:04:01    

Citation :

setCaretPosition
 
public void setCaretPosition(int position)
 
    Sets the position of the text insertion caret for the TextComponent. Note that the caret tracks change, so this may move if the underlying text of the component is changed. If the document is null, does nothing. The position must be between 0 and the length of the component's text or else an exception is thrown.


 
bon alors, pourquoi il faut le bouger à la main?
aussi, c'est pas le viewpane qu'il faudrait poueter, plutot? (enfin le bidule qui gere le scrolling quoi, ché pas)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 20-05-2005 à 10:30:33    

-- > la technique c'est de mette le caret à la fin (y'a une Position spéciale si je me souviens bien) et de mettre une propriété genre viewFollowCaret()
 
sauf que quand on clique, on déplace le caret. donc soit il faut remettre le caret à la fin de chaque insert, soit on coupe le lien entre l'évènement de souris et le déplacement du caret.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 20-05-2005 à 12:08:29    

Effectivement ca marche nikel le setCaretPosition(interactions.getText().length()), donc meme si on remonte la scrollBar a chaque insertion d'une nouvelle chaine ca descend le scrollBar automatiquement, mais bon le fait de recalculer le length() du text c'est pas franchement genial :/


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 20-05-2005 à 12:44:52    

je pense qu'il y a un cache de la longueur, ça m'étonnerait qu'il la recalcule à chaque fois.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 20-05-2005 à 13:42:00    

"Note that the caret tracks change, so this may move if the underlying text of the component is changed." mais !? :??:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 20-05-2005 à 13:42:00   

Reply

Marsh Posté le 21-05-2005 à 16:44:45    

-- > ben tu regardes l'offset du caret, tu insères du texte avant cet ofsset, tu re-regarde l'offset et le caret s'est barré à droite (enfin l'offset a augmenté [:aloy]), rien d'extraordinaire.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 21-05-2005 à 19:52:20    

ben j'aurais cru que c'était aussi applicable si on ajoutait du texte à la fin.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 21-05-2005 à 20:12:55    

c'est le cas.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 21-05-2005 à 20:13:57    

[:icon15] mais alors a quoi on joue ici avec setCaret là [:icon15]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 21-05-2005 à 20:20:08    

parce que l'utilisateur, avec sa cliquette, il risque d'avoir déplacé le caret depuis la dernière insertion si tu n'a pas trafiqué le traitement des évènements :heink:

Reply

Marsh Posté le 21-05-2005 à 20:20:37    

On joue à "la methode bourrine qui marche nikel" ...


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 21-05-2005 à 20:22:22    

bah perso, j'estime avoir fait un truc assez fin :o

Reply

Marsh Posté le 21-05-2005 à 20:31:17    

nraynaud a écrit :

parce que l'utilisateur, avec sa cliquette, il risque d'avoir déplacé le caret depuis la dernière insertion si tu n'a pas trafiqué le traitement des évènements :heink:


ha, oui ! :D
donc dans le cas d'un composant de texte non editable, le bidule va scroller automatiquement vers le bas tout seul?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 21-05-2005 à 20:38:01    

the real moins moins a écrit :

ha, oui ! :D
donc dans le cas d'un composant de texte non editable, le bidule va scroller automatiquement vers le bas tout seul?


non [:le kneu]
 
 
parce qu'on peut déplacer le curseur dans un truc non-éditable [:le kneu]
 
 
interro surprise pour voir si tu suis : dis-moi à quoi ça sert de déplacer le curseur sur un composant texte non-editable [:le kneu]

Reply

Marsh Posté le 21-05-2005 à 21:28:29    

nraynaud a écrit :

non [:le kneu]
 
 
parce qu'on peut déplacer le curseur dans un truc non-éditable [:le kneu]
 
 
interro surprise pour voir si tu suis : dis-moi à quoi ça sert de déplacer le curseur sur un composant texte non-editable [:le kneu]


 
Le curseur c'est le caret non ?  :??:  
 
Sinon je sais pas si t'a dis ca en plaisantant mais quand je fait setEditable(false) sur un JTextArea on peut rien deplacer à part une eventuelle srcollBar ... par contre on peut plus selectionner le texte :/ faudrait un truc du genre setSelectable(true)  [:chronoklazm]
 
EDIT : ah non dsl j'ai dis des betises le texte est bien selectionable !
 
RE-EDIT : Ca serait possible de le rendre non selectionable ?  :lol:


Message édité par Chronoklazm le 21-05-2005 à 21:31:40

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 21-05-2005 à 21:44:22    

en mettant le selectionModel à null ? (pas testé)
 
déplacer le caret quand c'est désactivé, ça permet de faire la sélection avec shift+flèches.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed