您正在阻止事件分发线程,这将阻止它更新UI.您可以使用线程,但是Swing是单线程API,这意味着仅应从事件调度线程的上下文中对UI进行更新.
您可以使用SwingWorker,它将允许您在后台线程中执行长时间运行的过程,但是它支持安全地将更新同步到UI.
例如,借助其进度和PropertyChange支持,它变得易于管理.
public class Worker extends SwingWorker {
@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();
}
}
您可以使用EDT的发布/处理支持以及对EDT的更新,PropertyChange支持或worker的done方法,以在EDT内部安全完成工作时获取其结果.