Java等待JFrame完成
我有一个登录框,我必须等待来自另一个线程。成功登录框架后自行处置。我想弹出应用程序的主框架。现在我正在观看布尔值以确定何时触发主框架。这样做的正确方法是什么?看着一个布尔值只是不觉得优雅。Java等待JFrame完成
如果您有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,主框架即可运行。
您也可以使用Semaphore
或Condition
(或java.util.concurrent
的几个其他选项中的任何一个),但为此目的,CountDownLatch
似乎更易于使用。
+1,正是我所需要的。 – 2012-07-17 13:44:12
在处理Swing(实际上是AWT)时,你真正必须理解的是,你需要保持与AWT Event Dispatch Thread(EDT)的组件的所有交互。
因此,请从EDT登录。使用new Thread
或更好的java.util.concurrent.ExecutorService
。当您发现您已登录时,请使用java.awt.EventQueue.invokeLater
重新登录EDT。匿名内部类非常适合捕获上下文,尽管它们使用了非常冗长的语法,但使代码更短。
不清楚你在等什么。你可以在后台线程中进行登录,然后登录完成后使用SwingUtilities.invokeLater()关闭登录表单并显示主窗体? – 2009-04-28 23:08:47