Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 22
  1. #1

    Aiuto su multi thread e jdialog

    ciao!
    in un metodo, che esegue operazioni su un server remoto, vorrei far apparire un jdialgo con prgoress bar, e chiuderlo appena le operazioni sono finite:
    codice:
                    final JDialog jd = new JDialog(this, "", true);
                    JProgressBar bar = new JProgressBar();
                    bar.setIndeterminate(true);
                    jd.add(BorderLayout.CENTER, bar);
                    jd.add(BorderLayout.NORTH, new JLabel("Progress..."));
                    jd.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
                    jd.setSize(300, 75);
                    jd.setLocationRelativeTo(this);
                    Thread t = new Thread(new Runnable() {
    
                        @Override
                        public void run() {
                            jd.setVisible(true);
                        }
                    });
                    t.start();
                    // DO STUFF
                    // CHIUDERE JDIALOG E CHIUDERE THREAD
    mi basta richiamare jd.setVisible(false) alla fine per chiudere anche il thread?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    RTFM Read That F*** Manual!!!

  3. #3
    ciao!
    si nel frattempo ho fatto un pò di cambiamenti:
    codice:
    public class LoadingDialog extends SwingWorker<Object, Object> {
    
        private JDialog jd;
    
        public LoadingDialog(JFrame frame) {
            jd = new JDialog(frame, true);
            jd.add(BorderLayout.CENTER, new JLabel("Progress..."));
            jd.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
            jd.setSize(300, 75);
            jd.setResizable(false);
            jd.setLocationRelativeTo(frame);
        }
    
        @Override
        protected Object doInBackground() throws Exception {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    jd.setVisible(true);
                }
            });
            return null;
        }
    
        @Override
        protected void done() {
            jd.setVisible(false);
        }
    }
    poi nel JFrame:
    codice:
    LoadingDialog ld = new LoadingDialog(this);
    ld.execute();
    // DO STUFF
    solo che non funziona molto bene.
    nel senso che prima fa le operazioni, e poi mi mostra il dialog!

  4. #4
    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
    solo che non funziona molto bene.
    nel senso che prima fa le operazioni, e poi mi mostra il dialog!
    doInBackground è il metodo in cui far eseguire un lavoro "lungo", eseguito nel contesto di un altro thread (gestito da SwingWorker) che non è il EDT.
    Dove è quindi il tuo lavoro "lungo"? Perché così come è LoadingDialog, non serve a granché allora ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e lo usi male
    Il metodo doInbackground serve a fare le operazioni che ciucciano risorse.
    Tu dal thread principale crei un JDIalog con la progress bar, barra aggiornata tramite il metodo publish


    penso che questo te lo puoi riciclare bellamente

    http://www.javacreed.com/swing-worker-example/
    RTFM Read That F*** Manual!!!

  6. #6
    il lavoro lungo è eseguito in quello principale.
    il jdialog lo volevo solo per fare che vedere che c'è una operazione in corso.
    in questo caso è giusto che il programma non sia disponibile fino a che il lavoro non è finito.

    ho levato anche la progressbar in verità.
    avrei bisogno solo del dialog che parte quando iniziano le altre operazioni, e si chiude quando le operazioni finiscono.

    ho letto anche il tutorial di valia, ma non lo vedo molto più complicato come esempio.
    a me servirebbe una cosa più basica.

  7. #7
    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
    il lavoro lungo è eseguito in quello principale.
    "principale" cosa? Intendi il Event-Dispatch-Thread (EDT)? Allora è sbagliato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    e quello che vuoi fare tu in realtà si fa con un jdialog e uno swing worker, sembra complesso ma è più semplice di quanto tu possa immaginare.
    L'operazione lunga va fatta in un thread a parte (giusto per liberare l'EDT), non vuoi gestire la progress bar e va benissimo, prima di partire visualizzi jdialog, premi ok e parti e quando fniisci visualizzi messaggio che hai finito.
    RTFM Read That F*** Manual!!!

  9. #9
    ok.
    quindi in sostanza è che questo quello che dovrei fare giusto?
    codice:
    public class LoadingDialog extends SwingWorker<Object, Object> {
    
        private JDialog jd;
        private Service jsb;
    
        public LoadingDialog(JFrame frame) {
            jsb = new Service();
            jd = new JDialog(frame, true);
            jd.add(BorderLayout.CENTER, new JLabel("...LOADING..."));
            jd.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
            jd.setSize(300, 75);
            jd.setResizable(false);
            jd.setLocationRelativeTo(frame);
        }
    
        @Override
        protected Object doInBackground() throws Exception {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        jd.setVisible(true);
                        // OPERAZIONI
                    } catch (IOException ex) {
                        JOptionPane.showMessageDialog(null, ex.getMessage());
                    }
                }
            });
            Thread.sleep(4000);
            return null;
        }
    
        @Override
        protected void done() {
            jd.setVisible(false);
        }
    }
    così mi sembra che funzioni già meglio.
    nel jframe invece faccio solo richiamo al worker:
    codice:
    LoadingDialog ld = new LoadingDialog(this);
    ld.execute();

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    no, lo swing worker non istanzia il JDialog. Lo swingworker è un thread a parte e non contiene niente di grafica.
    studia bene come applicarlo, so che funziona bene ma è qualche anno che non lo uso e non ho tempo adesso di rifarti un esempio
    RTFM Read That F*** Manual!!!

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.