JScrollBar aus Thread heraus aufs Maximum setzen

ntpnexus

Grünschnabel
Hallo allerseits,

ich bin gerade dabei ein kleines Chat-Programm (Java, Swing, MVC-Konzept) zu programmieren und stoße auf ein nerviges Problem:

Ich habe eine kleine grafische Oberfläche mit einem JTextPane (Log), JTextArea (schreiben) und einem Button (Senden).

Ich lasse in meinem Chat-Client im Hintergrund als Thread eine Art Server laufen (mit Runnable..). Dieser Server wartet nun auf einkommende Verbindungen und behandelt diese.

Die Methode zum Einfügen des Text in mein JTextPane ist im Controller mit der Methode addToLog(String text); ansprechbar.

Beim Einfügen eines neuen Textes in das Log soll die Scrollbar nach unten gescrollt werden, was ich über
Code:
logPane.scrollRectToVisible( outputTextPane.getVisibleRect() );
erreiche.

Das erstmal als allgemeine Infos. Nun mein eigentliches Problem:

Drücke ich auf den Button Senden, so wird der Text über die Methode dem Log hinzugefügt und das JTextPane wie gewünscht nach unten gescrollt.
Bekommt der Server nun eine Anfrage rein, möchte er dem Log gerne etwas hinzufügen, also ruft der Server (im Thread laufend) die Methode im Controller auf. Der Text erscheint im GUI, jedoch wird die JTextPane bzw. das dazugehörige JScrollPane nicht nach unten gescrollt.

Ich hoffe ihr habt das soweit verstanden, ansonsten fragt gerne nach.

Ich habe mal irgendwo gelesen, dass Swing manchmal Probleme mit Threads hat, besonders wenn 2 Threads auf die gleiche Komponente zugreifen. Ob dies der Fall ist weiß ich nicht genau, eigentlich ruft der Server die Methode im Controller auf und der Controller sagt meinem GUI dass er den Text hinzuzufügen hat.

Gibt's für mein Problem einen Workaround o.ä.? Ich hab schon einiges versucht, Zeitverzögerungen mit Thread.sleep() ausprobiert um dann zeitverzögert nach unten zu scrollen.
Langsam weiß ich nicht mehr weiter, denn es ist mitunter ganz schön nervig bei jeder neuen Nachricht ganz nach unten zu scrollen.

Ich hoffe ihr könnt mir helfen.

Danke und Gruß
Markus
 
Hallo,

hatte ähnliches Problem mit einer JList.
Ich habe den ganzen Kram, der was mit der JList zu tun hat in einen
extra thread gepackt, und es geht nun.Es stimmt, dass SWT probleme mit
Threads hat - läuft jedoch das Model (in meinem Fall das ListModel) als
Daten-Halter im Thread, funktioniert auch das GUI dazu. Allerdings sei erwähnt, dass
es nicht funktioniert, wenn man die Funktion in einen herkömmlichen Thread packt -
der Effekt ist, dass genausoviel passiert wie vorher OHNE Thread :D

Musst also folgendes tun:
Code:
try {
      EventQueue.invokeAndWait(new Runnable() {
        public void run() {
          final String data = "New Value";
          getModel().set(1, data);
        }
      });
}
catch(Exception e) {
  e.printStackTrace();
}

Beachte: Du kannst NUR daten nehmen, die nicht lokal sind - musst also die Daten
aus dem anderen Thread "zwischenspeichern" und STATIC machen.

LG
Andy
 
Zurück