gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:05:17 24 4
gpt4 key购买 nike

仅当方法结束时,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,这意味着只能在事件分派(dispatch)线程的上下文中对 UI 进行更新。

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

例如,结合其 progressPropertyChange 支持,它变得易于管理。

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;

}
}

“进度 Pane ”

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 支持和更新、PropertyChange 支持或工作人员的完成方法来获取工作人员在 EDT 内安全完成后的结果

关于java - 如何更改进度条和标签的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915454/

24 4 0