Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problema con SwingWorker

    ciao!

    alla pressione di un bottone, vorrei lanciare un dialog (il classico loading dialog) e poi una operazione in background.
    questo il codice messo nell'evento legato al bottone:
    codice:
                btnConnect.addActionListener((ActionEvent e) -> {
                final JDialog loading = new JDialog();
                JPanel p1 = new JPanel(new BorderLayout());
                p1.add(new JLabel("Please wait..."), BorderLayout.CENTER);
                loading.getContentPane().add(p1);
                loading.pack();
                loading.setLocationRelativeTo(null);
                loading.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
                loading.setModal(true);
                SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
    
                    @Override
                    protected Void doInBackground() throws Exception {
                        createConnection();
                        return null;
                    }
                };
                worker.execute();
                loading.setVisible(true);
                try {
                    worker.get();
                } catch (InterruptedException | ExecutionException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            });
    questo invece il metodo createConnection:
    codice:
    private void createConnection() {
            try {
                if (CheckConnection.check()) {
                    // OPERAZIONI
                    System.out.println("FATTO");
                } else {
                    JOptionPane.showMessageDialog(null, "No connection");
                }
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }
    alla fine delle operazioni mi esce la scritte FATTO in console, ma il jdialog non si chiude.
    dove sto sbagliando??

  2. #2
    ok mi sembra di aver risolto:
    codice:
    public class GenericDialog extends JDialog {
    
        public GenericDialog(JFrame parent, String title, String message) {
            super(parent, title, true);
            setLocationRelativeTo(parent);
            JPanel messagePane = new JPanel();
            messagePane.add(new JLabel(message));
            getContentPane().add(messagePane);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            pack();
            setModal(true);
        }
    }
    evento del jbutton:
    codice:
          btnConnect.addActionListener((ActionEvent e) -> {
                final GenericDialog loading = new GenericDialog(this, "", "Loading...");
                SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
    
                    @Override
                    protected Void doInBackground() throws Exception {
                        createConnection();
                        return null;
                    }
    
                    @Override
                    protected void done() {
                        loading.dispose();
                    }
                };
                worker.execute();
                loading.setVisible(true);
                try {
                    worker.get();
                } catch (InterruptedException | ExecutionException ex) {
                    JOptionPane.showMessageDialog(null, ex.getMessage());
                }
            });
    la cosa che mi mancava era il metodo done().
    così funziona, ma si accettano consigli ovviamente!!

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ma fai worker.get(); (che ti serve se dà Void?) e lo fai nel contesto del EDT, quindi comunque lo stai bloccando.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Ma fai worker.get(); (che ti serve se dà Void?) e lo fai nel contesto del EDT, quindi comunque lo stai bloccando.
    ciao andbin!

    per il get hai ragione.
    avevo fatto diverse prove prima con String e mi sono dimenticato di levarlo.

    per il bloccare l'EDT, come dovrei fare per non bloccarlo?
    lanciare un altro thread nel doInBackground??

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    come dovrei fare per non bloccarlo?
    lanciare un altro thread nel doInBackground??
    doInBackground è già in un thread a parte .... è questo il senso di SwingWorker! SwingWorker usa sotto-sotto un thread e in più offre una API che permette di aggiornare più comodamente la interfaccia utente (invece che usare il solito invokeLater) usando passaggi "nascosti" tra il thread in background e il EDT tramite publish/process e altro documentato in SwingWorker.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.