Java等待JFrame完成

3

我有一个登录框,需要等待另一个线程完成。成功登录后,该框将自动关闭。我想要弹出应用程序的主窗口。目前,我正在观察一个布尔值来确定何时启动主窗口。这种方法并不优雅,正确的做法是什么?


不清楚你在等什么。你能否在后台线程中完成登录,然后当登录完成时使用SwingUtilities.invokeLater()关闭登录窗口并显示主窗口? - Sam Barnum
2个回答

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 似乎更容易使用。


2

在处理Swing(实际上是AWT)时,你需要明确的一点是:必须将所有与AWT事件分发线程(EDT)组件的交互保持一致。

因此,登录时不要使用EDT。使用new Thread或更好的java.util.concurrent.ExecutorService。当你发现已经登录成功后,使用java.awt.EventQueue.invokeLater返回到EDT。匿名内部类非常适合捕获上下文,并且尽管语法可怕而冗长,但可以缩短代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接