Ich habe den folgenden Anwendungsfall:
Ich habe Code in Thread A (nicht EDT) ausgeführt. Dann möchte ich dem Benutzer eine Frage stellen, aber das muss auf dem EDT geschehen, da es Swing-Code beinhaltet (Öffnen eines Dialogs usw.). Schließlich möchte ich die Antwort des Benutzers zurück an Thread A übergeben, damit es fortgesetzt werden kann.
Ich habe Mühe, eine gute Möglichkeit zu finden, die Antwort des Benutzers an Thread A zurückzugeben. Wie machst du das?
In Thread A können Sie SwingUtilities.invokeAndWait (Runnable) verwenden, um Ihre Benutzereingabeaufforderung auf dem EDT auszuführen. Dies wird Thread A blockieren, bis Ihre ausführbare Datei abgeschlossen ist (d. H. Bis der Benutzer ein Ergebnis übermittelt und Sie ihn irgendwo gespeichert haben). Ihre ausführbare Datei kann so geschrieben werden, dass das Ergebnis irgendwo gespeichert wird, dass Thread A darauf zugreifen kann, sobald Thread A wieder die Kontrolle erlangt.
Grundsätzlich müssen Sie EventQueue#invokeAndWait
(AKA SwingUtilities#invokeAndWait
) verwenden. Dies wird den aktuellen Thread blockieren, bis die run-Methode zurückkehrt.
Der eigentliche Trick ist, es einzurichten, damit Sie den Rückgabewert erhalten;)
%Vor% In diesem Beispiel erstelle ich im Grunde ein eigenes Abfrageobjekt, die implements Runnable
und kann die Antwort vom Benutzer speichern
Ich schrieb die folgende Bequemlichkeitsmethode, um jtahlborns Antwort hinzuzufügen. Es fügt eine Prüfung hinzu, um zu vermeiden, den EDT zu blockieren, und stellt eine nette gestraffte Ausnahmebehandlung zur Verfügung:
%Vor%Sie nennen es so, und müssen sich keine Sorgen machen, ob Sie gerade auf dem EDT ausführen oder nicht:
%Vor%Diese util -Methode macht, was im Lieferanten in einem separaten Swing-Thread ist, und wartet bis zur Antwort. Es wird auch eine Ausnahme ausgelöst, wenn Folgendes vorhanden ist:
%Vor%Und hier zwei Tests, damit Sie sehen können, wie man es benutzt:
%Vor%Es gibt noch Raum, es zu verbessern, um es allgemeiner zu machen, weil diese Implementierung in SwingUtilities weiterleitet und manchmal ThreadExecutor verwendet werden soll.
Tags und Links java swing event-dispatch-thread