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 {
}
答案 0 :(得分:3)
您正在阻止事件调度线程,这阻止了它更新UI。您可以使用Thread
,但Swing是单线程API,这意味着只应在事件调度线程的上下文中对UI进行更新。
您可以使用SwingWorker
,这将允许您在后台线程中执行长时间运行的进程,但它支持安全地同步UI的更新。
与progress
和PropertyChange
支持一起,例如,管理变得容易。
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;
}
}
&#34;进度窗格&#34;
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
支持或工作人员的完成方法来获取工作人员的结果它是在EDT内安全地完成的。