2 回答
TA贡献1795条经验 获得超7个赞
与SwingWorker结合使用。在此处查看示例: SwingWorker和进度栏
@气垫船:你是对的。请允许我参考JavaDoc的相应SwingWorker页面,我认为这最好地说明了情况。
TA贡献1862条经验 获得超7个赞
正如@happyburnout所指出的那样,最好在单独的线程中处理下载,使用SwingWorker可能是您所做工作的最佳解决方案。
主要原因是您阻止了事件调度线程(AKA EDT)的运行,从而阻止了任何重新绘制请求(以及其他UI重要内容)的处理。
你应该通读
Swing中的并发
工人线程和秋千工人
现在,这几乎直接从API文档中获取,但是给出了一个SwingWoker带有JProgressBar
工人”...
public class Worker extends SwingWorker<Object, Object> {
@Override
protected Object doInBackground() throws Exception {
// The download code would go here...
for (int index = 0; index < 1000; index++) {
int progress = Math.round(((float)index / 1000f) * 100f);
setProgress(progress);
Thread.sleep(10);
}
// You could return the down load file if you wanted...
return null;
}
“进度窗格”
public class ProgressPane extends JPanel {
private JProgressBar progressBar;
public ProgressPane() {
setLayout(new GridBagLayout());
progressBar = new JProgressBar();
add(progressBar);
}
public void doWork() {
Worker worker = new Worker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
worker.execute();
}
}
记住秋千的黄金法则
从不,从不从ThreadEDT中更新任何UI组件
始终在其他地方执行耗时的任务 Thread
(关于布局管理器的某些东西,更多是个人问题;)
使用Swing:D,您将度过轻松愉快的时光
添加回答
举报