Frage

Ich habe einen Login-Rahmen, die mich für von einem anderen Thread warten. Nach der erfolgreichen Anmeldung Rahmen verfügt selbst. Und ich will den Hauptrahmen für die Anwendung öffnet. Im Moment habe ich einen Booleschen Wert bin gerade zu bestimmen, wann der Hauptrahmen zu feuern. Was ist der richtige Weg, dies zu tun? Beobachten ein boolean Wert nur nicht elegant fühlt.

War es hilfreich?

Lösung

Wenn Sie Java 5 oder höher zur Verfügung, könnten Sie ein CountDownLatch . Zum Beispiel ist der Hauptrahmen unter der Annahme, anfänglich in der Steuerung, haben den Hauptrahmen die CountDownLatch mit einer Verzögerung von 1 anlegen und diese Verriegelung zu dem Login-Rahmen übergeben. Dann haben die Hauptrahmen warten auf die Klinke 0 werden:

CountDownLatch loginSignal = new CountDownLatch(1);
     ...    // Initialize login frame, giving it loginSignal 
     ...    // execute login frame in another Thread
// This await() will block until we are logged in:
loginSignal.await();

Haben Sie den Login-Rahmen, wenn Sie fertig sind, verringern den Latch:

loginSignal.countDown();

Stellen Sie sicher, dass es keine Möglichkeit für Ihren Login-Rahmen zu verlassen, wo er vergisst, um die Verriegelung zu verringern! Sobald die CountDownLatch 0 erreicht, der Hauptrahmen wird runnable.

Sie könnte auch ein Semaphore oder Condition ( oder jeder von einigen anderen Entscheidungen von java.util.concurrent), aber zu diesem Zweck ein CountDownLatch scheint einfacher zu bedienen.

Andere Tipps

Was Sie wirklich mit dem Umgang mit Schaukel verstehen müssen (und in der Tat AWT), ist, dass Sie alle Interaktionen mit den Komponenten des AWT Event Dispatch Thread (EDT) halten müssen.

Also, das Login an der EDT. Verwenden Sie einen new Thread oder ein java.util.concurrent.ExecutorService verbessern. Wenn Sie feststellen, dass Sie angemeldet sind, verwenden java.awt.EventQueue.invokeLater wieder auf den EDT zu bekommen. Anonyme innere Klasse ist für Kontext zu erfassen und trotz ihrer horrend ausführlichen Syntax, der Code kürzer zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top