gpt4 book ai didi

java - 自定义 Java 初始屏幕 "freezes",直到整个应用程序加载完毕

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:15 25 4
gpt4 key购买 nike

我有一个程序,需要很长时间才能加载。因此,我想开发一个启动画面,可以向用户提供有关正在加载的内容的反馈。带有图像、标签和 JProgressBar 的简单 JFrame。

我一直在试验,我得到的最好结果是在我的 main() 中这样做:

SwingUtilities.invokeAndWait(new Runnable() {

public void run() {

new SplashScreen();
}
});

SwingUtilities.invokeAndWait(new Runnable() {

public void run() {

//Code to start system
new MainFrame();
//.. etc
}
});

SplashScreen 和 MainFrame 都是扩展 JFrame 的类。我也在使用 Substance 作为库。

SplashScreen 的构造函数将 JLabel 和 JProgressBar 添加到自身,打包并设置为可见。JProgressBar 是 setIndeterminate(true);

当我运行我的程序时,会显示我的 SplashScreen,但 ProgressBar 被锁定,它不会移动,直到程序的其余部分启动后它才会按预期开始移动。

我在这里错过了什么?我所做的所有搜索似乎都没有提到这个问题,而且大多数“自定义启动画面”实现都以与我非常相似的方式解决这个问题。

最佳答案

只是试图比 Allain 的正确答案更笼统一些。

您的系统中有一个线程可以(合法地)更新 GUI。

如果您正在使用该线程来初始化您的系统,guis 将不会更新。

如果您尝试从您的主线程更新您的 GUI,那么什么都不会正确。

始终注意您的 GUI 在哪个线程上,并确保不要在该线程上工作。

以这种方式思考 GUI 更新:

  • 您的非图形用户界面线程更新了您正在显示的值(比如完成的百分比)。
  • 它通过 invokeLater 发布更新,然后继续其他工作。
  • GUI 线程执行您的 invokeLater,它使用从非 GUI 线程传递的数据更新您的 GUI
  • 它退出的 GUI 线程!这允许系统的其他不相关部分在需要时更新 GUI。

非 GUI 线程通常是来自 Thread.start 的线程和传递给“main”的线程

GUI 线程是执行您的“invokeLater”以及从 GUI 事件(按下按钮、GUI 计时器、任何 Swing 监听器)传递给您的任何内容的线程。

因此,大多数情况下,当需要更新 GUI 时,您已经在 GUI 线程上——只需注意启动顺序和线程想要更​​新显示的位置。

关于java - 自定义 Java 初始屏幕 "freezes",直到整个应用程序加载完毕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2358093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com