我们已经为我们的应用程序构建了启动画面。当应用程序的初始化在主线程中时它工作正常,但是当我在 EDT 中移动初始化时(主方法中的 SwingUtilities.invokeLater),由于 EDT 的阻塞,进度条和信息标签不会自行重绘。我知道,使用 invokeLater 可以帮助我重新绘制 GUI。但我的问题是:很难将应用程序的初始化分成单独的部分(遗留代码)。即使我这样做,我也会得到一个丑陋的 matroshka 代码(在 invokeLater 中有六次 invokeLater)。
我应该选择哪种解决方案:
- 在主线程中保留初始化(我目前的决定)
- 尝试将其移至 EDT(如果可能)并获取 matroshka 代码
- 每次我更新启动画面时,使用 Foxtrot 库在 EDT 中提供非阻塞 sleep (它工作正常 - 启动画面可以自行重绘,但这对我来说是一个 hack)
可能有人有更好的解决方案?
附言我已经在这里阅读了一些类似的问题,但没有发现任何对我有帮助的问题。
最佳答案
在 SwingWorker
的 doInBackground()
方法中加载源数据, 和 publish()
中间结果;在 process()
中更新 GUI 组件的模型。当数据继续加载时,将显示初始结果并且 GUI 将正常运行。加载数据的实际时间将保持不变,但感知的时间会更少。
关于java - 带有进度条的应用程序和启动画面的初始化 (Swing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23912610/