J'ai trouvé une gruge. Je laisse systématiquement une ligne blanche en bas du JTextPane pour éviter que la dernière ligne contienne un emoticone et fiche la grouille.
J'insère à l'initialisation de mon JTextPane un retour à la ligne.
Par la suite toutes mes insertions se font juste avant ce retour à la ligne :
doc.insertString(doc.getLength()-1, "toto", doc.getStyle("defaut"));
Pour détecter si l'utilisateur suit le chat en temps réel ou bien regarde des vieilles phrases, j'ai agrandi la détection à la scroll barre tout en bas ou bien une ligne au dessus :
1 2
| JScrollBar vbar = parent.scrollchatField.getVerticalScrollBar();
boolean autoScroll = ((vbar.getValue() + vbar.getVisibleAmount()) > vbar.getMaximum()-15); |
Et finalement je positionne la barre de scrolling à une ligne de la fin du chat pour pas afficher la ligne vide.
if( autoScroll ) this.setCaretPosition(doc.getLength()-5);
C'est pas top mais le résultat est tout à fait acceptable je trouve.
Je reste preneur pour une vrai belle solution, je met pas en résolu, ça me convient pas à 100% cette "solution".
Partager