SwingWorker in Java

Ho un problema.

Ho un JFrame . JDialog un JDialog .

Quando viene premuto il pulsante su JDialog , deve essere eliminato e deve essere inviata un’e-mail. Allo stesso tempo, ho bisogno di un altro JDialog per apparire con JProgressBar indeterminato. Quando viene inviata l’e-mail, JDialog deve essere eliminato (e ne viene creato uno nuovo) o il suo contenuto dovrebbe cambiare.

Ho fallito con questo per diverse ore ora, quindi sto chiedendo enyone se lui (o lei) sarebbe stato così gentile da scrivermi uno pseudo-codice che farà ciò che voglio.

Solo per vedere cosa dovrebbe essere incluso nella class SwingWorker (o usare il multithreading se pensi che sia meglio), quando JDialog (s) dovrebbe essere creato / eliminato e dove inserire l’invio di e-mail …

So che sto chiedendo una soluzione finita qui, ma sono in una dedline e ho già fallito tante volte … Questa è stata la mia ultima risorsa …

    Ho fatto un breve esempio per te spero che sia d’aiuto. In JFrame viene mostrato un pulsante JFrame con:

    inserisci la descrizione dell'immagine qui

    quando viene cliccato il JButton sul frame, comparirà un JDialog con un altro JButton ( Send Email ) – questo rappresenterebbe la finestra di posta elettronica :

    inserisci la descrizione dell'immagine qui

    Quando si preme JButton emailDialogemailDialog si emailDialog della emailDialog e si crea un nuovo JDialog che manterrà la emailDialog avanzamento (o in questo caso una semplice JLabel ):

    inserisci la descrizione dell'immagine qui

    e quindi crea ed esegue lo SwingWorker per inviare l’e-mail e dispose() del JDialog quando è terminato e mostra un messaggio JOptionPane che mostra il successo dell’invio:

    inserisci la descrizione dell'immagine qui

     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 actionPerformsd(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 actionPerformsd(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

    uscita dalla Sostanza L & F (in te ci sono delle incertezze riguardo a EDT che a scopo di test)

     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 

    e altre 200 linee sui dettagli

    l’output è "correct container created out of EDT"

    inserisci la descrizione dell'immagine qui

    Lo testerò su un altro L & F, non ci saranno problemi con Nimbus, SystemLokkAndFeel nella maggior parte dei casi non si preoccupa dei grandi errori su EDT (sensibilità molto diversa all’EDT), Metal di default non ha alcun problema sulla piattaforma Windows e per Java6, il tuo esempio funziona anche su seconde basi

    MODIFICARE

    Anche a Nimbus non interessa

    inserisci la descrizione dell'immagine qui

    dal codice

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