Problemy z wielowątkowością w oknie dialogowym Swing around tworzą / niszczą [duplikat]

Możliwy duplikat:
SwingWorker w Javie

Mam kilka klas, które muszą współpracować, ale tak nie jest.

Po pierwsze mam Main:

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();
   }
  }
 }
}

Tworzy klasę 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);
 }

Wywołuje klasę Worker, która rozszerza wątek:

public class Worker extends Thread
{
    Exception e;

    public Worker(Exception error)
    {
        e = error;
    }

    @Override
    public void run()
    {
    //do something that takes time
     PrimaryErrorDialog.cleanUpAndContinue();
    }

Powraca do PrimaryErrorDialog, który musiałby poinformować użytkownika, że ​​zadanie zostało zakończone, a następnie zakończyć to okno dialogowe.

Następnie wracamy do głównego, gdzie tworzony jest masterWindow.

Cały ten kod jest wykonywany przed utworzeniem masterWindow, ponieważ ten segment jest uruchamiany, gdy wystąpi błąd (jeśli nie ma LAF, brakuje plików .proprties itp.) ...

Dlatego stworzyłem atrapę JFrame, więc JDialog może się do niej dołączyć, nie chciałem, aby była to JFrame.

Ten kod jest również wykonywany później w programie, dla „prawdziwych” błędów w czasie wykonywania niektóre klasy mają nieco inne parametry i / lub konstruktory.

Jednak to nie działa, próbowałem na milion sposobów, próbowałem z SwingWorker, nic nie robi tego, co chcę. Zazwyczaj kod e-mail nie jest nawet osiągnięty lub program nie czeka na usunięcie okien dialogowych ...

A czego chcę

Występuje błąd. Pojawi się okno dialogowe informujące mnie o błędzie i pytające, czy chcę wysłać raport o błędzie. Mówię „nie” - okno dialogowe zamyka się, usuwając cały program, jeśli błąd jest fatalny. Mówię tak - okno dialogowe zamyka się, nowe otwiera się z nieokreślonym paskiem postępu, W tle wysyłany jest e-mail ze śledzeniem stosu. E-mail zostanie wysłany, okno dialogowe z paskiem postępu zostanie zamknięte, a nowy zostanie otwarty, informując o wysłaniu mojego raportu o błędzie. Wciskam ok i zamyka się okno dialogowe, usuwając cały program, jeśli błąd jest fatalny, w przeciwnym razie kontynuuje w miejscu, w którym pozostał z klasy głównej.

Uwaga: błąd może wystąpić w każdej klasie, nie pochodzi tylko z Main ...

questionAnswers(2)

yourAnswerToTheQuestion