Проблемы с многопоточностью в диалоге Swing вокруг создания / уничтожения [дубликат]

Possible Duplicate:
SwingWorker in Java

У меня есть несколько классов, которые должны работать вместе, но это не так.

Например, у меня есть 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();
   }
  }
 }
}

Он создает класс 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);
 }

Он вызывает класс 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.

Весь этот код выполняется до создания masterWindow, поскольку этот сегмент запускается при возникновении ошибки (если отсутствует LAF, отсутствуют файлы .proprties и т. Д.) ...

Вот почему я создал фиктивный JFrame, так что JDialog может присоединиться к нему, я не хотел превращать его в JFrame.

Этот код также выполняется позже в программе для "реального" Ошибки во время выполнения, некоторые классы просто имеют немного разные параметры и / или конструкторы.

Тем не менее, это не работает, я пробовал это миллионами способов, я пытался с SwingWorker, кажется, ничего не делает то, что я хочу. Обычно код электронной почты даже не достигается, или программа не ждет, пока диалоговые окна будут удалены ...

И что я хочу?

Ошибки происходят. Появляется диалоговое окно, сообщающее, что произошла ошибка, и спрашивающее, хочу ли я отправить отчет об ошибке. Я говорю «нет» - диалог закрывается, удаляя всю программу, если ошибка фатальная. Я говорю да - диалог закрывается, новый открывается с неопределенным индикатором выполнения, В то время как электронная почта с stacktrace отправляется в фоновом режиме. Письмо отправлено, диалоговое окно с индикатором выполнения закрывается и открывается новое сообщение о том, что мой отчет об ошибке отправлен. Я нажимаю ОК и диалоговое окно закрывается, удаляя всю программу, если ошибка является фатальной, в противном случае продолжается там, где она осталась от класса Main.

Примечание. Ошибка может возникать в любом классе, она не только из Main ...

Ответы на вопрос(2)

Ваш ответ на вопрос