Проблемы с многопоточностью в диалоге 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 ...