Java等待JFrame完成

我有一个登录框架,我必须等待另一个线程。 成功登录框架后自行处理。 我想弹出应用程序的主框架。 现在我正在观看一个布尔值来确定何时启动主框架。 这样做的正确方法是什么? 看一个布尔值只是感觉不优雅。

如果您有Java 5或更高版本,则可以使用CountDownLatch 。 例如,假设主帧最初处于控制状态,让主帧创建CountDownLatch ,倒数为1,并将此锁存器传递给登录帧。 然后让主框架等待锁存器变为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(); 

完成登录框后,递减Latch:

 loginSignal.countDown(); 

确保您的登录框架无法退出忘记闩锁的位置! 一旦CountDownLatch达到0,主框架就会变为可运行。

您也可以使用SemaphoreCondition (或java.util.concurrent任何其他选项),但为此, CountDownLatch似乎更容易使用。

处理Swing(实际上是AWT)时你真正必须理解的是,你需要保持与AWT事件调度线程(EDT)组件的所有交互。

所以,从EDT登录。 使用new Thread ,或者更好的java.util.concurrent.ExecutorService 。 当您发现已登录时,请使用java.awt.EventQueue.invokeLater返回EDT。 匿名内部类非常适合捕获上下文,尽管它们的语法非常冗长,但使代码更短。