您正在阻止事件分发线程,这将阻止它更新UI。您可以使用
Thread,但Swing是单线程API,这意味着只能从事件分配线程的上下文中对UI进行更新。
您可以使用
SwingWorker,这将允许您在后台线程中执行长时间运行的过程,但是它支持将更新安全地同步到UI。
加之其
progress与
PropertyChange支持,就很容易进行管理,例如。
public class Worker extends SwingWorker<Object, Object> { @Override protected Object doInBackground() throws Exception { // The download pre 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中使用
publish/
process支持和更新EDT,
PropertyChange支持或工作人员的done方法,以安全完成工作时从EDT中获取工作人员的结果



