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
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
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() );
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