Я использую потоки в приложении через класс 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);
}
});
}
Вызов метода get in done приведет к двум блокам try-catch, поскольку вычислительная часть генерирует исключения, поэтому я думаю, что в конце это чище.