SwingWorker в Java

У меня проблема.

У меня есть JFrame . Это создаст JDialog .

Когда кнопка JDialog нажата, она должна быть JDialog и отправлено электронное письмо. В то же время мне нужен еще один JDialog для отображения с неопределенным JProgressBar . Когда отправляется электронное письмо, JDialog должен либо быть JDialog (и новый кретен), либо его содержимое должно измениться.

Я провалился с этим несколько часов, поэтому я прошу enyone, если он (или она) будет достаточно любезен, чтобы написать мне псевдокод, который будет делать то, что я хочу.

Просто, чтобы узнать, что должно быть включено в class SwingWorker (или использовать multithreading, если вы считаете, что это лучше), когда JDialog (ы) должны быть созданы / удалены, и где следует JDialog электронную почту …

Я знаю, что я прошу законченное решение здесь, но я нахожусь на выносливости и провалился так много раз … Это было мое последнее средство …

Я сделал короткий пример, потому что вы надеетесь, что это поможет. В основном показана кнопка JFrame с кнопкой:

введите описание изображения здесь

при щелчке по JButton на фрейме JDialog появится с другим JButton ( Send Email ) – это будет диалоговое окно электронной почты :

введите описание изображения здесь

Когда JButton на emailDialog нажат, он имеет адрес электронной emailDialog и создает новый JDialog который будет удерживать индикатор прогресса (или в этом случае простой JLabel ):

введите описание изображения здесь

и затем он создает и выполняет SwingWorker для отправки электронной почты и dispose() JDialog после его завершения и отображения сообщения JOptionPane показывающего успех отправки:

введите описание изображения здесь

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Test { public static void main(String[] args) throws Exception { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Test().createAndShowUI(); } }); } private void createAndShowUI() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initComponents(frame); frame.setPreferredSize(new Dimension(300, 300));//testing purposes frame.pack(); frame.setVisible(true); } private void initComponents(final JFrame frame) { final JDialog emailDialog = new JDialog(frame); emailDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); emailDialog.setLayout(new BorderLayout()); JButton sendMailBtn = new JButton("Send Email"); sendMailBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //get content needed for email from old dialog //get rid of old dialog emailDialog.dispose(); //create new dialog final JDialog emailProgressDialog = new JDialog(frame); emailProgressDialog.add(new JLabel("Mail in progress")); emailProgressDialog.pack(); emailProgressDialog.setVisible(true); new Worker(emailProgressDialog).execute(); } }); emailDialog.add(sendMailBtn, BorderLayout.SOUTH); emailDialog.pack(); JButton openDialog = new JButton("Open emailDialog"); openDialog.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { emailDialog.setVisible(true); } }); frame.getContentPane().add(openDialog); } } class Worker extends SwingWorker { private final JDialog dialog; Worker(JDialog dialog) { this.dialog = dialog; } @Override protected String doInBackground() throws Exception { Thread.sleep(2000);//simulate email sending return "DONE"; } @Override protected void done() { super.done(); dialog.dispose(); JOptionPane.showMessageDialog(dialog.getOwner(), "Message sent", "Success", JOptionPane.INFORMATION_MESSAGE); } } 

@David Kroukamp

вывод от вещества L & F (у вас есть какие-то неопределенности в отношении EDT ust, что для целей тестирования)

 run: JButton openDialog >>> Is there EDT ??? == true Worker started >>> Is there EDT ??? == false waiting 30seconds Worker endeded >>> Is there EDT ??? == false before JOptionPane >>> Is there EDT ??? == false org.pushingpixels.substance.api.UiThreadingViolationException: Component creation must be done on Event Dispatch Thread 

и еще 200 строк о деталях

вывод "correct container created out of EDT"

введите описание изображения здесь

Я проверю это на другом L & F, там кувы будут выпущены с Nimbus, SystemLokkAndFeel в большинстве случаев не заботится о больших ошибках в EDT (очень различная чувствительность к EDT), Metal по умолчанию не имеет никаких проблем на платформе Windows и для Java6, то ваш пример работает и на вторых базах

РЕДАКТИРОВАТЬ

Нимбус тоже не заботится

введите описание изображения здесь

от кода

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.plaf.FontUIResource; public class Test { public static void main(String[] args) throws Exception { try { for (UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { UIManager.setLookAndFeel(info.getClassName()); UIManager.getLookAndFeelDefaults().put("nimbusOrange", (new Color(127, 255, 191))); break; } } } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (javax.swing.UnsupportedLookAndFeelException ex) { } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { /*try { UIManager.setLookAndFeel( "org.pushingpixels.substance.api.skin.SubstanceOfficeBlue2007LookAndFeel"); UIManager.getDefaults().put("Button.font", new FontUIResource(new Font("SansSerif", Font.BOLD, 24))); UIManager.put("ComboBox.foreground", Color.green); } catch (Exception e) { }*/ new Test().createAndShowUI(); } }); } private void createAndShowUI() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); initComponents(frame); frame.setPreferredSize(new Dimension(300, 300));//testing purposes frame.pack(); frame.setVisible(true); } private void initComponents(final JFrame frame) { final JDialog emailDialog = new JDialog(frame); emailDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); emailDialog.setLayout(new BorderLayout()); JButton sendMailBtn = new JButton("Send Email"); sendMailBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //get content needed for email from old dialog //get rid of old dialog emailDialog.dispose(); //create new dialog final JDialog emailProgressDialog = new JDialog(frame); emailProgressDialog.add(new JLabel("Mail in progress")); emailProgressDialog.pack(); emailProgressDialog.setVisible(true); new Worker(emailProgressDialog, frame).execute(); } }); emailDialog.add(sendMailBtn, BorderLayout.SOUTH); emailDialog.pack(); JButton openDialog = new JButton("Open emailDialog"); openDialog.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("JButton openDialog >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread()); emailDialog.setVisible(true); } }); frame.getContentPane().add(openDialog); } } class Worker extends SwingWorker { private final JDialog dialog; private final JFrame frame; Worker(JDialog dialog, JFrame frame) { this.dialog = dialog; this.frame = frame; } @Override protected String doInBackground() throws Exception { System.out.println("Worker started >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread()); System.out.println("waiting 30seconds "); Thread.sleep(30000);//simulate email sending System.out.println("Worker endeded >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread()); dialog.dispose(); System.out.println("before JOptionPane >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread()); JOptionPane.showMessageDialog(frame, "Message sent", "Success", JOptionPane.INFORMATION_MESSAGE); System.out.println("before JOptionPane >>> Is there EDT ??? == " + SwingUtilities.isEventDispatchThread()); return null; } } 
  • MVC Progress Bar Threading
  • Проблемы с SwingWorker и JProgressBar
  • JComponents, исчезающие после вызова mouseClicked ()
  • SwingWorker, done () выполняется до завершения вызовов ()
  • SwingWorker в другом методе SwingWorker
  • Может ли индикатор выполнения работать в classе за пределами основного?
  • Ядро Java swingWorker работает, но не получено или передано сообщение
  • Несколько графиков на нескольких фигурах с использованием jFreeChart
  • Как использовать SwingWorker в Java?
  • Не удается получить ArrayIndexOutOfBoundsException из будущего И SwingWorker, если stream запущен. Исполнитель
  • Как использовать SwingWorker?
  • Давайте будем гением компьютера.