如何更改进度条和标签的值?
仅当方法结束时, JLabel
和JProgressBar
才会更改其值。
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的更新。
例如,与其progress
和PropertyChange
支持一起,它变得易于管理。
public class Worker extends SwingWorker
“进度窗格”
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内安全地获取工作者的结果