2009-04-28 32 views
3

私は別のスレッドから待たなければならないログインフレームを持っています。ログインに成功すると、フレーム自体が廃棄されます。そして、私はアプリケーションのメインフレームをポップアップしたい。今、メインフレームを起動するタイミングを決めるブール値を見ています。これを行う正しい方法は何ですか?ブール値を見るだけではエレガントではありません。JavaがJFrameの終了を待つ

+0

あなたは何を待っているのか不明です。バックグラウンドスレッドでログインできますか?ログインが完了したら、SwingUtilities.invokeLater()を使用してログインフォームを閉じてメインフォームを表示しますか? –

答えて

11

Java 5以降が利用可能な場合は、CountDownLatchを使用できます。たとえば、メインフレームが最初に制御されていると仮定すると、メインフレームにはカウントダウンが1であるCountDownLatchが作成され、このラッチがログインフレームに渡されます。そして、0になるためのラッチ用メインフレーム待ちがあります

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(); 

は、ログインフレームを持っているし、終了したら、ラッチをデクリメント:

loginSignal.countDown(); 

にログインフレームのための方法がないことを確認してくださいラッチを減らすのを忘れるところに出てください! CountDownLatchが0になると、メインフレームが実行可能になります。

またSemaphoreまたはCondition(またはjava.util.concurrentから他のいくつかの選択肢のいずれか)を使用することができますが、この目的のために、CountDownLatchは使いやすいようです。

+1

+1、正確に私が必要としたもの。 –

+0

華麗!ありがとう! – Antonio

2

Swing(実際にはAWT)を扱う上で本当に理解しなければならないことは、AWT Event Dispatch Thread(EDT)のコンポーネントとのすべての対話を維持する必要があるということです。

したがって、EDTからログインしてください。 new Thread、またはそれより良いjava.util.concurrent.ExecutorServiceを使用してください。あなたがログインしたことを発見したら、java.awt.EventQueue.invokeLaterを使ってEDTに戻ります。匿名の内部クラスはコンテキストをキャプチャするのに最適です。また、非常に冗長な構文にもかかわらず、コードを短くします。

関連する問題