Wie man einen thread nicht frieren Sie ganze JFrame. JAVA
Hey, ich muss nur eine Frage beantwortet...
Wie würde ich den folgenden code nicht einfrieren mein ganzes JFrame?
try {
Thread.sleep(Integer.parseInt(delayField.getText()) * 1000);
System.out.println("Hello!");
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
verwenden Sie einen anderen thread, um diese Aufgabe durchzuführen. Wenn Sie dies tun, in der main-UI-thread, dann wird es einfrieren.. Sie können Zum Beispiel die folgenden
UPDATE
Nach kluge Vorschläge von Robin und Marko ich bin eine Aktualisierung der Antwort eine bessere Lösung.
JTextField#getText
ist nicht thread-sicher, man sollte nicht aufgerufen werden, die Methode aus einem anderen thread dann das EDTWann immer Sie verwenden
Thread.sleep
im GUI-code, aufhören, sich selbst und denke, dass der Swing Timer, was ist das richtige Werkzeug für den job. Die Aufgabe, die Sie durchführen müssen, mit einer Verzögerung.Mit einem anderen thread für diese ist nicht der beste Rat: er verliert einen schweren system-Ressource (einen thread) zu tun, aber absolut nichts mit warten.
Ist dies nicht der richtige Weg, um die Verwendung von threads in java . Sie verwenden sollten, swingutilities.invokelater
swing utils aufrufen später
Die Sie nicht ausführen wollen, das auf der Benutzeroberfläche (oder event dispatch thread) thread. Lieber in einem separaten thread. Ansonsten (wie Sie gesehen haben), werden Sie blockiert das UI.
Es ist eine gute übung, führen zeitintensive Operationen in einem separaten thread, und nutzen Sie SwingUtilities.invokeLater() wenn solche threads brauchen, um einige der nachfolgenden UI-Maßnahme (z.B. in der obigen Anzeige "Hello" in der Benutzeroberfläche (UI)