Java等待JFrame完成

Java等待JFrame完成,java,jframe,Java,Jframe,我有一个登录框架,我必须等待从另一个线程。成功登录后,框架将自行处理。我想弹出应用程序的主框架。现在我正在观察一个布尔值,以确定何时启动主框架。正确的做法是什么?观察布尔值感觉不优雅。如果您有Java 5或更高版本,您可以使用。例如,假设主框架最初处于控制状态,让主框架创建倒计时为1的倒计时闩锁,并将该闩锁传递给登录框架。然后让主机架等待闩锁变为0: CountDownLatch loginSignal = new CountDownLatch(1); ... // Initia

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

如果您有Java 5或更高版本,您可以使用。例如,假设主框架最初处于控制状态,让主框架创建倒计时为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();
让登录框在完成后减少闩锁:

loginSignal.countDown();
确保您的登录框架无法退出忘记减少闩锁的位置!当
倒计时闩锁
达到0时,主帧即变为可运行状态


您也可以使用or(或
java.util.concurrent
中的其他几个选项中的任意一个),但出于这个目的,
CountDownLatch
似乎更易于使用。

在处理Swing(事实上是AWT)时,您真正必须了解的是,您需要保持与AWT事件分派线程组件的所有交互(美国东部时间)


因此,请退出EDT登录。使用
新线程
,或者更好的是使用
java.util.concurrent.ExecutorService
。当您发现您已经登录时,使用
java.awt.EventQueue.invokeLater
返回EDT。匿名内部类非常适合捕获上下文,尽管它们的语法非常详细x、 缩短代码。

不清楚您在等待什么。是否可以在后台线程中登录,然后在登录完成后使用SwingUtilities.invokeLater()关闭登录表单并显示主表单?