Swing JTextArea aus anderer Klasse in realtime aktualisieren

Alen

Neues Mitglied
Hallo zusammen

In bin jetzt schon einige Tage an einem eigentlich simplen Problem - könnte man meinen – aber ich komme einfach nicht weiter.

Ich habe zwei Java Klassen:
- GUI.java
-Controller.java (hier auch auch die main() Methode.

Die Klasse GUI erstellt die GUI (JFrame). Im JFrame gibt es eine TextArea und einen Button „Start“.
Wenn man den Button „Start“ klickt, läuft ein längerer Job (kann bis 10-20 Minuten laufen) in Controller.java. Dieser Job schreibt Debug/Bearbeitungs-Informationen. Diese möchte ich in real-time in der Text Area darstellen. Dazu habe ich der Klasse GUI eine Methode „UpdateTextArea „ erstellt. Nun klappt das leider nicht. Die TextArea wird erst aktualisiert nachdem der ganze Job in Controller.java beendet ist. Obwohl ich Controller Code oft die Methode „UpdateTextArea“ aufrufe.

Ich vermute das Problem liegt irgendwo an den verschiedenen Threads bzw. habe ich es auch schon mit SwingUtilities.invokeAndWait versucht – leider ohne Erfolg.
Wie kann ich dieses Problem lösen?

Der Ablauf ist folgendermassen:

1. Die Klasse Controller beinhaltet die main() Methode
2. Hier erstelle ich ein Objekt MyGUI der Klasse GUI. Dem Konstruktur der GUI Klasse übergebe ich das Controller Objekt MyController.
3. Wenn man dann im GUI auf den Button <start> klickt wird die Methode MyController.StartJob() aufgerufen – diese führt den Job aus.
4. Innerhalb von StartJob() rufe ich dann die Methode gui.UpdateTextArea() auf. Jedoch wird der Update eben viel zu spät ausgeführt.



Danke für eure Hilfe!

Gruss
Alen
 
MyController.StartJob() muss man in einem separaten Thread ausführen, nicht auf dem Gui-Thread EDT (EventDispatchThread), sonst blockiert die Anzeige. Die Textarea muss natürlich auf dem Gui-Thread (EDT) aktualisieren.

Gruß.
André

PS: siehe auch Lesson: Concurrency in Swing
 
Zuletzt bearbeitet:
Hallo André

Danke für deine prompte Antwort. Werde dies mal versuchen.

-D.h. ich starte im MyController.StartJob() in einem neuen Thread.
-Und in der Methode gui.UpdateTextArea() muss ich sicherstellen, dass der Code im ETD läuft. D.h. ich verwende "SwingUtilities.invokeLater..." ?

Gruss
Alen
 

Zurück
Oben