我知道这个主题已经在很多问题上看到并得到了回答,但我仍然无法通过它。
我只想在提取大型 xml 文件的一些内容时更新进度条。我认为在不同的线程中进行耗时的循环就足够了,但是?.. 我设法得到的只是 progressBar 要么根本不显示,要么在最后更新,就在它关闭之前。
在应用程序启动附近的某个地方实例化,我有:
public class SomeClass {
private SomeClass () {
myXMLParser reader = new myXMLParser();
CoolStuff fromXml = reader.readTheXml();
}
}
在使用 JProgressBar 显示和更新 JDialog 时:
public class LoadingDialog extends JDialog {
private JProgressBar progressBar;
/* ... */
public void progress() {
progressBar.setValue(progressBar.getValue() + 1);
}
}
所以我有这个myXMLParser:
public class myXMLParser {
private LoadingDialog loadingDialog = new LoadingDialog();
public CoolStuff readTheXml() {
CoolStuff fromXml = new CoolStuff();
while(manyIterations) {
loadingDialog.progress();
fromXml.add(some() + xml() + reading());
}
return fromXml;
}
}
我已经看到很多使用事件SwingWorker
和使用PropertyChange
事件来更新进度条的事情,但是示例始终是一体的,处理和进度条在同一个类中,以及类中的类,自从我开始使用 Java 以来,我无法将其转化为我的情况。
任何帮助?..任何(不太明显)的建议?
编辑:所以多亏了 btantlinger,它的工作原理是这样的:
public class SomeClass {
private SomeClass () {
myXMLParser reader = new myXMLParser();
new Thread(new Runnable() {
@Override
public void run() {
CoolStuff fromXml = reader.readTheXml();
}
}).start();
}
}
public class LoadingDialog extends JDialog {
private JProgressBar progressBar;
/* ... */
public void progress() {
progressBar.setValue(progressBar.getValue() + 1);
}
}
public class myXMLParser {
private LoadingDialog loadingDialog = new LoadingDialog();
public CoolStuff readTheXml() {
CoolStuff fromXml = new CoolStuff();
while(manyIterations) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
loadingDialog.progress();
}
});
fromXml.add(some() + xml() + reading());
}
return fromXml;
}
}