我只想在整个 UI 正常启动时运行一个线程,即。所有组件都已paint()
完成。我试过了SwingUtilities.invokeLater()
,但线程仍然在整个 UI 启动之前或所有组件paint()
未完成时运行。
有可能吗?
谢谢。
我只想在整个 UI 正常启动时运行一个线程,即。所有组件都已paint()
完成。我试过了SwingUtilities.invokeLater()
,但线程仍然在整个 UI 启动之前或所有组件paint()
未完成时运行。
有可能吗?
谢谢。
无法知道整个 UI 何时启动,主要是因为您编写了自己的众多组件,这些组件可能需要自己的甜蜜时间才能加载。
有SwingUtilities.invokeAndWait。但时机将是一个问题。从某种意义上说,一旦你确定你已经调用了设置你的 UI 的初始化代码,你就必须调用它。
一种方法是可能有一个检查标志。假设您有 5 个主要组件,每个加载后都会设置自己的检查标志(或者您可以说拥有标志的公共类)。您的线程将继续等待所有 ckeckflags,然后继续。
您也可以使用 CountdownLatch,但我不会推荐它。把事情简单化。
好的。现在我明白你的问题是什么了。方法paint() 不适合进行invokeLater() 调用。
方法paint() 可能会被多次调用。实际上,每当需要重新绘制屏幕的一部分时都会调用它。
您可能希望在侦听器的代码中或在对话框关闭时添加以后的调用,但绝不应该从方法 paint() 调用。
此外,方法 paint() 本身总是从 Event Dispatch Thread 调用,因此如果要确保从 EDT 调用它,那么执行 invokeLater 就非常多余。
如果您向我们展示您为启动应用程序而编写的方法,我们可能会指出您需要在哪里进行代码调用。