2009-04-28 72 views
3

我有一個登錄框,我必須等待來自另一個線程。成功登錄框架後自行處置。我想彈出應用程序的主框架。現在我正在觀看布爾值以確定何時觸發主框架。這樣做的正確方法是什麼?看着一個布爾值只是不覺得優雅。Java等待JFrame完成

+0

不清楚你在等什麼。你可以在後臺線程中進行登錄,然後登錄完成後使用SwingUtilities.invokeLater()關閉登錄表單並顯示主窗體? – 2009-04-28 23:08:47

回答

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,主框架即可運行。

您也可以使用SemaphoreCondition(或java.util.concurrent的幾個其他選項中的任何一個),但爲此目的,CountDownLatch似乎更易於使用。

+1

+1,正是我所需要的。 – 2012-07-17 13:44:12

2

在處理Swing(實際上是AWT)時,你真正必須理解的是,你需要保持與AWT Event Dispatch Thread(EDT)的組件的所有交互。

因此,請從EDT登錄。使用new Thread或更好的java.util.concurrent.ExecutorService。當您發現您已登錄時,請使用java.awt.EventQueue.invokeLater重新登錄EDT。匿名內部類非常適合捕獲上下文,儘管它們使用了非常冗長的語法,但使代碼更短。