私はSwing Workerクラスを通してアプリケーションでスレッドを使用しています。それはうまく動作しますが、try-catchブロックにエラーメッセージダイアログを表示するのは悪い思いです。潜在的にアプリケーションをブロックできますか?これは現在の外観です:スイングワーカーでの優雅な例外処理
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
// Executed in background thread
public Void doInBackground() {
try {
DoFancyStuff();
} catch (Exception e) {
e.printStackTrace();
String msg = String.format("Unexpected problem: %s", e
.toString());
//TODO: executed in background thread and should be executed in EDT?
JOptionPane.showMessageDialog(Utils.getActiveFrame(),
msg, "Error", JOptionPane.ERROR_MESSAGE,
errorIcon);
}//END: try-catch
return null;
}
// Executed in event dispatch thread
public void done() {
System.out.println("Done");
}
};
Swing Workerフレームワークを使用して安全に行うことはできますか? publish()メソッドのオーバーライドはここで良いリードですか? EDIT
:
はこのようにそれをやった:
} catch (final Exception e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
e.printStackTrace();
String msg = String.format(
"Unexpected problem: %s", e.toString());
JOptionPane.showMessageDialog(Utils
.getActiveFrame(), msg, "Error",
JOptionPane.ERROR_MESSAGE, errorIcon);
}
});
}
計算部分が例外をスローするように、2つのtry-catchブロックにつながるdoneメソッドで取得呼び出すので、私はこれがあると思います最後にクリーナー。
done()メソッドでの処理は、これまで私がこの状況に近づいてきた方法です。 invokeLaterも素晴らしい解決策です。 – jzd
はい、そうではありませんが、OPの質問に答える+1 – mKorbel
1)SwingWorker内で例外がスローされる可能性のあるコードを実行することは決してできません2)PropertyChangeListenerはSwingWorkerからの例外をキャッチします3)このように問題が起きます:-) – mKorbel