GUI Freeze dank Thread.sleep(); Welche Lösung und wie?

Zeedan

Grünschnabel
Moin moin,
habe mich an ein bisschen Code gesetzt und brauche für einen Ablauf von mehreren Tastenschlägen Threads.
Nun wollte ich es in ein GUI implementieren und hat soweit auch ganz gut funktioniert.

Mein Problem ist nun, dass wenn es mal ein Problem gibt meine ActionListener von meinem Stop Knopf nicht erkannt wird weil sich mein JFrame aufhängt...

Im Folgenden werde ich ein Code beispiel posten und auf Lösungen hoffen welche ich gut umsetzten kann ;)

Java:
textTastenMillis.setText("50");

int tastenMillis = Integer.parseInt(textTastenMillis.getText());

for (int i = 0; i <= 6; i++) {
                        robot.keyPress(KeyEvent.VK_UP);
                        robot.keyRelease(KeyEvent.VK_UP);
                        try {
                            Thread.sleep(tastenMillis);
                        } catch (InterruptedException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }

                    }

Hier habe ich einem text einen Grundwert gegeben. Dieser entspricht für den Thread 50 Millisekunden. Da ich viele Threads benutzen muss erhalte ich dem entsprechen auch viele Try and Catches. Herausgefunden habe ich, dass Threads.sleep(); sofern es keinen weiteren Thread gibt das JFrame "killen".

Welche schnelle und simple Lösungen gibt es, da ich in Java noch nicht so fortgeschritten bin?

p.s: Gerne den Code nehmen und verändern ;)

Vielen Dank für eure Hilfe!
Gruß André
 
Hi,

ich vermute dass du deine Logik (welche länger dauert) innerhalb des ActionListener des Button abhandelst?
Das ist nicht gut, der ActionListener läuft im AWT-Event-Thread und wenn dieser blockt, dann "hängt" die gesammte GUI. Lagere deine Logik in einen eigenen Thread aus, dann solltest du keine Probleme haben.

Grüsse,
BK
 
Danke für deine Hilfe, da stehe ich aber nun leider auf dem Schlauch... Hänge daran das zu realisieren.
 
So kompliziert ist das nicht. Es gibt halt einen Thread, der dafür verantwortlich ist, die GUI zu zeichnen, in diesem werden auch die Events von Buttons etc abgearbeitet. Je länger die Aufgabe in einem solchen Event dauert, desto länger dauert es, bis die GUI neu gezeichnet werden kann oder andere Events abgearbeitet werden können. Dadurch friert die GUI ein.

Um dies zu vermeiden, musst du längere Aufgaben in einen eigenen Thread auslagern. Hier findest du eine kleine Einführung in Threads. Rheinwerk Computing :: Java ist auch eine Insel 14.2 Threads erzeugen

Viele Grüße
Sascha
 
Zurück