それで、私は SwingWorker のことを理解しました。
しかし、別の問題が発生しました(図を参照)...
Swing ワーカーは、エラー報告と電子メール送信を正確に管理し、電子メール送信は長時間 (0.5 秒以上) のタスクであるため、便利です...
エラーが処理される前にプログラムが実行を継続するのを防ぐために、EDT スレッドを一時停止する必要があります (その同期化されたもので)。ただし、それはまた、不確定な JProgressBar が持っていて、メッセージの送信中に使用されているクールな小さなアニメーションを一時停止します。つまり、EDT が一時停止するときです。
私の質問は、プログラムの実行を停止し、同時に JProgressBar でアニメーションを表示する方法はありますか?
これはやや疑似コードです:
メインクラスのエラーが発生 - スレッドを同期して一時停止し、SwingWorker を実行する別のクラスを実行 (作成) します (別のクラスが必要です。そうでなければ、これでそれほど問題はありませんでした)。
new ErrorDialog(Main.modal, lang.getString("errorConfigMissingTitle"), lang.getString("errorConfigMissingMessage"), e, false);
それはこれを呼び出します:
//bunch of code, this below is an action listener of one of the buttons
String s = "";
(new ErrorSender(parent, error, s, dialog)).execute();
synchronized (s)
{
try
{
s.wait();
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
}
dialog.dispose();
//create JDialog that tell user message was sent
SwingWorker クラスは、sendingErrorReport JDialog を作成し (JProgressBar を使用)、バックグラウンドでメッセージを送信します。メッセージが送信されると、一時停止が解除されます (notyfyAll())。
public class ErrorSender extends SwingWorker<Boolean, Void>
{
Exception e;
String s;
public ErrorSender(JFrame parent, Exception error, String k, JDialog sendingDialog)
{
e = error;
s = k;
sendingDialog = new JDialog(parent, "Sending...", false);
JProgressBar progress = new JProgressBar();
progress.setString("Sending report...");
progress.setStringPainted(true);
progress.setIndeterminate(true);
sendingDialog.getContentPane().add(progress);
sendingDialog.pack();
sendingDialog.setLocationRelativeTo(null);
sendingDialog.getContentPane().validate();
sendingDialog.setResizable(false);
sendingDialog.setVisible(true);
}
@Override
protected Boolean doInBackground() throws Exception
{
//send email here
synchronized (s)
{
s.notifyAll();
}
return null;
}
}
一時停止が削除されない場合、done() に到達/呼び出されないため、done() メソッドから一時停止を削除していません...