【问题标题】:Run Thread only when whole UI is up仅在整个 UI 启动时运行线程
【发布时间】:2013-01-27 09:44:44
【问题描述】:

我只想在整个 UI 正常启动时运行一个线程,即。所有组件的paint() 已完成。 我尝试使用SwingUtilities.invokeLater(),但在整个 UI 启动或所有组件的paint() 未完成之前,线程仍然运行。

有可能吗?

谢谢。

【问题讨论】:

  • 是的。有可能的。这取决于您何时调用 invokeLater()。请分享您的代码,以便我们查看。

标签: java multithreading invokelater


【解决方案1】:

无法知道整个 UI 何时启动,主要是因为您编写了自己的众多组件,这些组件可能需要花费自己的时间才能加载。

SwingUtilities.invokeAndWait。但时机将是一个问题。从某种意义上说,一旦你确定你已经调用了设置你的 UI 的初始化代码,你就必须调用它。

一种方法是可能有一个检查标志。假设您有 5 个主要组件,每个加载后都会设置自己的检查标志(或者您可以说拥有标志的公共类)。您的线程将继续等待所有 ckeckflags,然后继续。

您也可以使用 CountdownLatch,但我不推荐它。保持简单。

【讨论】:

    【解决方案2】:

    好的。现在我明白你的问题是什么了。方法paint() 不适合调用invokeLater()。

    方法paint() 可能会被多次调用。实际上,每当需要重新绘制屏幕的一部分时都会调用它。

    您可能希望在侦听器的代码中或在对话框关闭时添加以后的调用,但绝不应该从方法 paint() 调用。

    此外,方法 paint() 本身总是从 Event Dispatch Thread 调用,因此如果要确保从 EDT 调用它,那么调用 invokeLater 就非常多余。

    如果您向我们展示您为启动应用程序而编写的方法,我们或许能够为您指出需要进行代码调用的确切位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2015-08-13
      相关资源
      最近更新 更多