обновление JProgressBar во время обработки
Я знаю, что этот вопрос уже был замечен во многих Вопросах и на него даны ответы, но все же я не могу пройти через него.
я всего-лишь хочуобновлять ProgressBar при извлечении некоторых вещей большого файла XML. Я думал, что этого было достаточно, чтобы цикл, занимающий много времени, находился в другом потоке, но? .. Все, что мне удалось получить, - это прогрессбар, который либо вообще не показывался, либо обновлялся в конце незадолго до его закрытия.
Instanced где-то рядом с запуском приложения, у меня есть:
public class SomeClass {
private SomeClass () {
myXMLParser reader = new myXMLParser();
CoolStuff fromXml = reader.readTheXml();
}
}
при показе и обновлении JDialog с помощью JProgressBar:
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
события обновляют progressBar, но примеры всегда приводятсявсе в одномс обработкой и индикатором выполнения в одном и том же классе, а также с классами внутри классов, и так как я начинаю на 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;
}
}