我有一个JProgressBar,希望能够看到它动态更新。进度条应该能够明显从一个位置移动到另一个位置,而不仅仅是更改而不会使条形图明显改变(想想常规加载条)。
public static void dropHPBar(int before, int after) {
Thread.currentThread.sleep(50);
while (before > after) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
GameMain.gW.setHP(before);
b --;
}
来自GameMain.gW:
public void setHP(int x) {
hpBar.setValue(x);
}
为什么进度条没有明显更新?
答案 0 :(得分:3)
在EDT
(事件调度线程)中调用Thread.sleep
会阻止UI更新。您需要使用Swing Worker才能归档正确的concurrency。
来自Oracle网站:
Swing由三种线程组成:
初始线程,执行初始应用程序代码的线程。
事件调度线程,执行所有事件处理代码。大多数与Swing框架交互的代码也必须 在这个帖子上执行。
工作线程,也称为后台线程,执行耗时的后台任务。
事件派发线程上的任务必须快速完成;如果他们不这样做, 未处理的事件备份,用户界面无响应。