如何更改进度条和标签的值?

仅当方法结束时, JLabelJProgressBar才会更改其值。

 this.desSave.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { DownloadXml(); } }); private void DownloadXml() throws Exception { Integer a = 456; int value = (1000 / a) - 1; this.numDes.setText("0" + "/" + a); for (int i = 0; i < a; i++) { saveXml(ligas.get(i),i,path); this.numDes.setText(i + "/" + a); //this is a jlabel this.progressbar.setValue(value * i); //jprogressbar } } private void SaveXml(String xml,int a,String path) throws IOException { } 

您正在阻止事件派发线程,这阻止了它更新UI。 您可以使用Thread ,但Swing是单线程API,这意味着只应在事件调度线程的上下文中对UI进行更新。

您可以使用SwingWorker ,它允许您在后台线程中执行长时间运行的进程,但它支持安全地同步UI的更新。

例如,与其progressPropertyChange支持一起,它变得易于管理。

 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(); } } 

您可以使用publish / process支持和更新EDT, PropertyChange支持或worker的done方法,以便在EDT内安全地获取工作者的结果