Java 显示在事件调度线程中构建GUI的进度的初始屏幕

Java 显示在事件调度线程中构建GUI的进度的初始屏幕,java,swing,splash-screen,event-dispatch-thread,Java,Swing,Splash Screen,Event Dispatch Thread,根据需要,所有GUI操作都应该在事件调度线程中执行 虽然我理解Swing设计为单线程模型的原因,但我不知道如何解决以下问题: 让我们使用一个名为buildGui()的方法来初始化应用程序的主GUI。调用buildGui()方法需要10秒才能返回 让我们使用另一个名为splashScreen()的方法,它显示了JDialog,其中包含不确定的JProgressBar。JDialog的目的很明显:它向用户反馈应用程序正在加载资源、初始化组件等 现在,如果我的程序调用: splashScreen();

根据需要,所有GUI操作都应该在事件调度线程中执行

虽然我理解Swing设计为单线程模型的原因,但我不知道如何解决以下问题:

让我们使用一个名为
buildGui()
的方法来初始化应用程序的主GUI。调用
buildGui()
方法需要10秒才能返回

让我们使用另一个名为
splashScreen()
的方法,它显示了
JDialog
,其中包含不确定的
JProgressBar
JDialog
的目的很明显:它向用户反馈应用程序正在加载资源、初始化组件等

现在,如果我的程序调用:

splashScreen();   // build and show splash screen in EDT
buildGui();       // build main GUI in EDT
启动屏幕被冻结10秒,因为它等待
buildGui()
完成


您对如何在遵循Swing的单线程模型时显示描述GUI初始化状态的启动屏幕有何想法?(
buildGui()
)使用AWT启动屏幕,以便在加载Swing包之前加载启动屏幕。插件本身就是纯AWT。另见本问题


虽然我通常会说“这个千年,使用Swing组件”,但将AWT用于启动非常有意义。

将AWT用于启动屏幕,这样就可以在加载Swing包之前加载它们。插件本身就是纯AWT。另见本问题


虽然我通常会说“这个千禧年,使用Swing组件”,但使用AWT作为一个亮点是很有意义的。

看一看其中包含的示例代码,它完全可以做您想要的。

看一看其中包含的示例代码,它完全可以做您想要的。

我认为您对Swing的模型有点困惑。您可以在另一个线程中创建UI组件,但不能绘制它们。您可以在不同的线程中构建GUI,但必须使它们在EDT中可见/绘制。此外,我很好奇为什么构建GUI需要那么长时间。@Kylar,我不确定您是否正确。读这篇文章。引用:“一旦实现了Swing组件,所有可能影响或依赖于该组件状态的代码都应该在事件调度线程中执行。现在将这些指令扔出窗口,因为大约在JSE 1.5发布时,Sun站点上的所有示例都发生了更改。”@YuRDeD,这不是重点。因为设备速度很慢,有数千个组件需要初始化,所以需要花费很长时间。@miso如果您使用的是速度很慢的设备,并且试图同时构建包含数千个组件的UI,我想知道你是否应该重新考虑设计UI的决定。我认为你对Swing的模型有点困惑。您可以在另一个线程中创建UI组件,但不能绘制它们。您可以在不同的线程中构建GUI,但必须使它们在EDT中可见/绘制。此外,我很好奇为什么构建GUI需要那么长时间。@Kylar,我不确定您是否正确。读这篇文章。引用:“一旦实现了Swing组件,所有可能影响或依赖于该组件状态的代码都应该在事件调度线程中执行。现在将这些指令扔出窗口,因为大约在JSE 1.5发布时,Sun站点上的所有示例都发生了更改。”@YuRDeD,这不是重点。因为这个设备很慢,有数千个组件需要初始化,所以它需要很长时间。@miso如果你使用的是一个速度慢的设备,并且你试图同时构建一个包含数千个组件的UI,我想知道你是否不应该重新考虑设计UI的决定。谢谢,我会尝试一下。谢谢,我要试一试。