この件はすでに多くの質問で見られ、回答されていることは知っていますが、それでも理解できません。
大きなxmlファイルの一部を抽出しながら、progressBarを更新したいだけです。時間のかかるループを別のスレッドに入れるだけで十分だと思いましたが、..私が取得できたのは、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
ましたが、例は常にオールインワンであり、処理とプログレスバーが同じクラス内にあり、クラス内にクラスがあります。それを私の状況に翻訳することはできません。
何か助けはありますか?.. (あまり明白ではない) アドバイスはありますか?
編集: 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;
}
}