重複の可能性:
Java の SwingWorker
一緒に作業する必要があるクラスがいくつかありますが、そうではありません。
1つには、メインがあります:
public class Main
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
//JFrame dummy for JDialog errors
modal = new JFrame();
new PrimaryErrorDialog("Title", "Message", e, false);
JFrame masterWindow = new JFrame();
masterWindow.setVisible();
}
}
}
}
PrimaryErrorDialog クラスを作成します。
private JDialog dialog = this;
private JTextArea text;
private JPanel buttonContainer;
private JButton sendErrorReportT, sendErrorReportF;
public PrimaryErrorDialog(String title, String message,
final Exception error, final boolean exit)
{
super(Main.modal, title, true);
//JButton for sending error report
sendErrorReportT = new JButton("Send Error Report");
sendErrorReportT.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
dialog.dispose();
dialog = new JDialog(Main.modal, "Sending...", true);
Worker thread = new Worker(error);
thread.start();
JProgressBar progress = new JProgressBar();
progress.setIndeterminate(true);
dialog.add(progress);
dialog.pack();
dialog.setVisible(true);
}
});
//JButton for not sending error report
sendErrorReportF = new JButton("Don't send error report");
sendErrorReportF.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
dialog.dispose();
if (exit)
{
System.exit(0);
}
}
});
buttonContainer = new JPanel();
buttonContainer.add(sendErrorReportT);
buttonContainer.add(sendErrorReportF);
add(text);
add(buttonContainer);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
public void cleanUpAndContinue()
{
dialog.dispose();
dialog = new JDialog(Main.modal, "title", true);
dialog.add(/*Jbutton with listener that disposes this dialog*/)
dialog.setVisible(true);
}
Thread を拡張する Worker クラスを呼び出します。
public class Worker extends Thread
{
Exception e;
public Worker(Exception error)
{
e = error;
}
@Override
public void run()
{
//do something that takes time
PrimaryErrorDialog.cleanUpAndContinue();
}
PrimaryErrorDialog に戻り、タスクが完了したことをユーザーに通知し、そのダイアログを終了する必要があります。
次に、masterWindow が作成される main に戻ります。
エラーが発生したときにこのセグメントが実行されるため (LAF が存在しない場合、.proprties ファイルが見つからない場合など)、このコードはすべて masterWindow の作成前に実行されます...
そのため、JDialog を接続できるようにダミーの JFrame を作成しました。これを JFrame にしたくありませんでした。
このコードは、プログラムの後半でも実行されます。「実際の」実行時エラーの場合、一部のクラスには少し異なるパラメーターやコンストラクターがあります。
しかし、これは機能しません。私は何百万もの方法で試しました.SwingWorkerで試しましたが、私が望むものは何もないようです. 通常、電子メールコードに到達しないか、プログラムがダイアログが破棄されるのを待ちません...
そして、私は何をしたいですか?
エラーが発生します。エラーが発生したことを通知し、エラー レポートを送信するかどうかを尋ねるダイアログが表示されます。いいえ、エラーが致命的である場合は、ダイアログが閉じ、プログラム全体がダウンします。はいと言います-ダイアログが閉じ、新しいダイアログが不定のプログレスバーで開き、スタックトレースを含む電子メールがバックグラウンドで送信されています。電子メールが送信され、プログレスバーを含むダイアログが閉じ、エラーレポートが送信されたことを示す新しいダイアログが開きます。[OK] を押すとダイアログが閉じ、エラーが致命的な場合はプログラム全体が削除され、それ以外の場合は Main クラスから離れたところから続行されます。
注: エラーはどのクラスでも発生する可能性があります。それは Main のみからではありません...