[HowTo] Java swing – Scroller automatiquement dans un jTextArea

J’ai eu besoin de faire un petit logiciel de contrôle de flux récemment et j’y ai donc intégré une console affichant les évènements reçus du réseau, etc.
Pour que ma console soit sexy, j’ai voulu que celle-ci affiche toujours les derniers messages arrivés et donc qu’elle scroll toute seule vers le bas. Malheureusement, swing ne semble pas gérer cela de base **arf**, il va donc falloir un peu ruser.
Pour faire cela (j’utilise Netbeans au passage), lorsque l’on ajoute un jTextArea, un jScrollPane dans lequel il se trouve est automatiquement créé. C’est parfait. Si vous faite votre interface à la main, il faut donc mettre votre jTextArea que nous appellerons jta dans un jScollPane que nous appellerons jsp

On commence par récupérer la jScrollBar de notre jsp

[sourcecode language="java"]
JScrollBar scrollBar = jsp.getVerticalScrollBar();
[/sourcecode]

On ajoute ensuite le texte que l’on veut dans notre jTextArea

[sourcecode language="java"]
jta.append("Scroll and look at me !");
[/sourcecode]

Ensuite, on regarde si celle-ci est visible. Si c’est le cas, c’est que le jTextArea est déjà plein et on la place donc en bas

[sourcecode language="java"]
if(scrollBar.isVisible())
jta.setCaretPosition(jta.getDocument().getLength());
[/sourcecode]

Voilà, rien de plus simple et très pratique.

Maintenant, voyons le cas ou on aurait bougé dans notre jTextArea et que l’on ne veuille pas scroller à chaque fois qu’un nouveau message y est ajouté… **beaucoup d’applications ne gèrent pas ça et c’est vraiment agaçant!!!**
Pour cela, on rajoute une ligne afin de vérifier si la scrollbar est déjà en bas (dans le cas où on n’aurait donc pas bougé :

[sourcecode language="java"]
boolean isAtBottom = ((scrollBar.getValue() + scrollBar.getVisibleAmount()) == scrollBar.getMaximum());
[/sourcecode]

Puis, on remplace notre test par :

[sourcecode language="java"]
if(isAtBottom)
jta.setCaretPosition(jta.getDocument().getLength());
[/sourcecode]

Voilà, en espérant que ce petit tip aidera :)

  1. [...] [HowTo] Java swing – Scroller automatiquement dans un jTextArea | Zoubda Blog – Olivier Leplus [...]

  1. Aucun trackback pour l'instant