2009-04-28 73 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。匿名内部类非常适合捕获上下文,尽管它们使用了非常冗长的语法,但使代码更短。