gpt4 book ai didi

java - 无法在繁重的进程下更新 Swing 组件

转载 作者:行者123 更新时间:2023-11-29 03:42:03 24 4
gpt4 key购买 nike

我在匿名 SwingWorker 线程下运行一个非常繁重的进程。同时,我使用进度条向 GUI 报告进度。然而,Swing 线程让我陷入困境。它只是没有及时更新任何东西。我不确定该怎么做,因为我已经尝试从 SwingWorker 线程和外部更新 GUI,但都拒绝工作。

如何在繁重的工作线程运行时可靠地更新 Swing UI?

我尝试过的事情

这不起作用(在 invokeLater 命令中有或没有包装)。

new LocalCompressor(compressor).execute();

while (!compressionDone) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
int percent = compressor.getPercentDone();
progressBar.setValue(percent);
statusLabel.setText(percent);
}
});
}

此外,尝试从并发测量线程更新 UI 是行不通的:

class LocalCompressor extends SwingWorker<Void, Void> {

// [...]

public LocalCompressor(Compressor compressor) {
this.compressor = compressor;

// [...]
}

@Override
protected Void doInBackground() {

final Thread t1 = new Thread(new Runnable() {

@Override
public void run(){
compressor.compress();
}
});

final Thread t2 = new Thread(new Runnable() {

@Override
public void run() {

t1.start();

while (t1.isAlive()) {
updateUI(compressor.getPercentDone());
}
}

});

t2.start();

return null;
}

// [...]
}

最佳答案

您并没有真正使用您的 SwingWorker。 worker 本身已经是一个线程。如果您有可能将长时间运行的代码放入 doInBackground() , 把它放在那里。然后调用publish(Integer)根据您的实际进度处理您在 process(List<Integer>) 中获得的 block -方法。在 process() 中你可以更新 gui,它在 EDT 上。

编辑:实际上,您现在正在做的是在几个 while 循环中进行轮询,这有点耗电。这就是为什么我认为它对你的算法中的事件更好,每次你得到一个百分比或每次循环开始新一轮或类似的东西。

关于java - 无法在繁重的进程下更新 Swing 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12715432/

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