【发布时间】:2013-10-04 19:29:22
【问题描述】:
我有一些带有for 循环的简单代码。在循环的每一次通过中,我都必须增加 JProgressBar;但是,这不起作用。见下文:
public void atualizarBarraDeProgresso(final int valorGeral, final int valorAtual) {
Thread threadProgressoCarregamento = new Thread() {
@Override
public void run() {
jProgressBarPersistindo.setValue(valorAtual);
}
};
threadProgressoCarregamento.start();
}
我在如下循环中调用方法“atualizarBarraDeProgresso”:
progressBar.setMinimum(0);
progressBar.setMaximum(qtd);
for(int i = 0; i < qtd; i++) {
atualizarBarraDeProgresso(qtd, i + 1);
doSomething();
}
但是我的进度条没有任何反应。
【问题讨论】:
-
你真的想要那么多线程吗?无论如何,我怀疑问题在于 循环本身 发生在 ADT 上(即在“点击处理程序”中)并且 阻塞 Swing UI 交互和更新直到它完成.考虑使用SwingWorker - 正确使用可能会消除所有问题。此外,请确保仅更新 ADT 上的 Swing 对象。
-
在任何时候设置值后,您是否在包含的 JPanel 上调用 repaint()?这可能就是缺少的一切。
-
调用repaint()方法,顺便说一下,解决方法很糟糕。
-
@user2246674(礼貌的咳嗽)由'ADT'DYM'EDT'?对于OP,一般提示。不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用
Thread.sleep(n)实现一个SwingTimer用于重复任务或SwingWorker用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。 -
这是所需逻辑的一个有趣的反转:此代码确保修改是唯一的操作 不是 i> 在美国东部时间。
标签: java multithreading swing event-dispatch-thread jprogressbar