# GUI hängt während Programm läuft



## redbomber (23. Dez 2010)

Hi zusammen
und schon wieder hab ich ein Problem... :/

Ich habe ein Tool mit einer GUI.
Der Benutzer kann Dateien auswählen, Einstellungen zu diesen Dateien verändern usw.
Wenn er fertig ist drückt er einen Knopf "Start" und dann wird mit diesen Dateien etwas gemacht.

Nun wärs ja ganz nett den Benutzer darüber zu informieren was gerade abläuft...sonst denkt er ja das Programm hat sich aufgehängt, da die Aktionen teilweise etwas länger dauern können.

Also habe ich in der GUI eine Tabelle eingefügt, die über das TableModel über die aktuellen Aktionen informiert wird und diese entspechend in eine Zeile der Tabelle schreibt (z.B. Zeitpunkt | Info | usw.)

Das ganze funktioniert auch, aber erst wenn alle Dateien bearbeitet wurden.
Dann schreibt er alle Infos zu den Aktionen rein, die seltsamerweise alle exakt zur selben Zeit "erstellt" wurden.

Ok, dann dachte ich, ich muss die ganze Aktion in einen extra Thread verpacken.
Also hab ich nun einen Thread, der beim Drücken des Knopfes "Start" die Aktionen mit den Dateien vornimmt...
Geht aber noch immer nicht. Die ganze GUI hängt. Also ich kann z.B. nicht die ScrollPane anklicken oder sonst was.

Die Frage ist nun, woran liegt das? Warum hängt denn alles?


----------



## eRaaaa (23. Dez 2010)

redbomber hat gesagt.:


> Ok, dann dachte ich, ich muss die ganze Aktion in einen extra Thread verpacken.
> Also hab ich nun einen Thread, der beim Drücken des Knopfes "Start" die Aktionen mit den Dateien vornimmt...
> Geht aber noch immer nicht. Die ganze GUI hängt. Also ich kann z.B. nicht die ScrollPane anklicken oder sonst was.
> 
> Die Frage ist nun, woran liegt das? Warum hängt denn alles?



Also eig. dürfte das nicht passieren, hast du den Thread auch richtig mit start() gestartet anstelle von run? Das wird oft falsch gemacht. Ansonsten könnte ein bisschen Code sicherlich auch nicht schaden. Und den SwingWorker könntest du dir auch mal anschauen:
Worker Threads and SwingWorker (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)
Der kann immer wieder zwischendurch Informationen an den EDT/GUI-Thread übergeben, diese kannst du dann dort threadsicher aktualisieren.


----------



## henpara (23. Dez 2010)

du mußt den SwingWorker benutzen. dann kannst du in der "doinBackground" methode deinen code ausführen und deine gui hängt nicht.

mfg


----------



## redbomber (23. Dez 2010)

Also schon einmal vielen Dank!

1.
Ich habe run() verwendet anstatt start()
Gerade gelesen dass bei run() die Threads nacheinander starten und bei start() alle gleichzeitig.
Eine vom eigentlichem Problem abweichendende Frage:
Wenn ich nur einen Thread habe, wie bei mir, also ein Thread der alle Dateien nacheinander abarbeitet, wärs eigentlich egal ob run() oder start()!?

2.
Ja ich versuche hier mal etwas Code zu posten, Das ganze ist nur etwas groß geworden daher weiss ich nicht wo anfangen, damit der Code euch auch etwas bringt.

3.
Lese mir das eben mit SwingWorker durch. Um ehrlich zu sein habe ich bisher davon noch nie etwas gehört.


----------



## eRaaaa (23. Dez 2010)

redbomber hat gesagt.:


> 1.
> Ich habe run() verwendet anstatt start()
> Gerade gelesen dass bei run() die Threads nacheinander starten und bei start() alle gleichzeitig.
> Eine vom eigentlichem Problem abweichendende Frage:
> Wenn ich nur einen Thread habe, wie bei mir, also ein Thread der alle Dateien nacheinander abarbeitet, wärs eigentlich egal ob run() oder start()!?



Du hast ja nicht nur einen Thread, du hast den GUI-Thread, deinen main-Thread + den selbst erstellten vermutlich. run heißt einfach nur, dass du die Methode direkt aufrufst, so wie jede andere auch(synchron). Mit start wird die Methode nebenläufig zu den anderen ausgeführt, also das was du eig. erreichen möchtest(asynchron)


----------



## redbomber (23. Dez 2010)

eRaaaa hat gesagt.:


> Du hast ja nicht nur einen Thread, du hast den GUI-Thread, deinen main-Thread + den selbst erstellten vermutlich. run heißt einfach nur, dass du die Methode direkt aufrufst, so wie jede andere auch(synchron). Mit start wird die Methode nebenläufig zu den anderen ausgeführt, also das was du eig. erreichen möchtest(asynchron)



ok, verstehe  danke!


----------



## Gast2 (24. Dez 2010)

Und vergess nicht dass du sobald du wieder auf GUI Elemente zugreifen möchstest diese zum GUI Thread synchronisieren solltest siehe SwingUtilities.invokeLater


----------



## André Uhres (27. Dez 2010)

SirWayne hat gesagt.:


> siehe SwingUtilities.invokeLater



..oder im vorliegenden Kontext besser SwingWorker. Die Methoden "process" und "done" laufen automatisch auf dem Event Dispatch Thread, da kann man nicht so leicht etwas falsch machen.

Gruß,
André


----------

