应用程序初始化和带有进度条的启动画面(Swing)

3
我们为应用程序建立了一个启动屏幕。当应用程序的初始化在主线程中时,它可以正常工作,但是当我将初始化移动到EDT(在主方法中使用SwingUtilities.invokeLater)时,进度条和信息标签由于EDT的阻塞而无法重绘。我知道使用invokeLater可以帮助我重新绘制GUI。但我的问题是:将应用程序初始化分成单独的片段非常困难(遗留代码)。即使我这样做了,我也会得到一个丑陋的matroshka-code(六次invokeLater在invokeLater中)。
我应该选择哪种解决方案:
1. 将初始化保留在主线程中(我的当前决定) 2. 尝试将其移动到EDT(如果可能),并获得matroshka代码 3. 使用Foxtrot库在每次更新启动屏幕时提供EDT中的非阻塞休眠(它可以正常工作-启动屏幕可以重绘自己,但对我来说这是一种hack)
可能有人有更好的解决方案?
P.S. 我已经阅读了一些类似的问题,但没有找到对我有用的内容。

我不认为有必要在 EDT 上进行初始化。只需确保涉及 GUI 的所有内容都在 EDT 上完成,而其余部分如果需要可以在另一个线程中完成。 - Jonathan Drapeau
使用JWindow(需要JFrame作为父级)或无边框的JDialog,在官方API实现SplashScreen之前,这是最常见的解决方法。 - mKorbel
@mKorbel Swing元素,如进度条或标签,由于阻塞的EDT无法重绘自身。 - Sergiy Medvynskyy
@JonathanDrapeau 这是我的问题。在初始化时读取和使用了大量的XML布局文件。我无法将GUI和非GUI代码分离。目前我们在主线程中初始化没有问题,但我不确定它是否总是能正常工作。 - Sergiy Medvynskyy
@trashgod 你说得对。重构我们的初始化代码会更好(如果我有时间的话我会这样做),但我希望在这里能得到一个简单的解决方案。 - Sergiy Medvynskyy
显示剩余3条评论
1个回答

2
在一个SwingWorkerdoInBackground()方法中加载源数据,并在publish()中发布中间结果;在process()中更新GUI组件的模型。当数据继续加载时,将显示初始结果,并且GUI将正常运行。加载数据的实际时间将保持不变,但感知时间将减少。

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