Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160

    Aggiungere una progressBar collegata ad un processo (thread)

    Salve,

    prima di postare ho letto le precedenti discussioni e i vari tutorials, ma mi mancano dei passaggi per capire la questione e poterla mettere in pratica.

    Nella mia applicazione, ho un bottone cliccando il quale viene fatta una chiamata ad un webservice. Posto il codice strettamente connesso a ciò:

    codice:
    private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) {                                          
            setCursor(new Cursor(Cursor.WAIT_CURSOR));
            if (updateContactsJTable() == false){
                ...
              } 
            setCursor(new Cursor(Cursor.DEFAULT_CURSOR));   
    }   
    
    private boolean updateContactsJTable(){
    
            try {
                contactsManager.update();
                refreshContactsJTable();
                return true;
            } catch (WebServiceException ex) {
              ex.printStackTrace();
            } catch (ConnectException ex) {
               ex.printStackTrace();
            }
            return false;
        }
    
    /*
         * ricarica la lista dei contatti
         * */
        public void refreshContactsJTable(){
    
            contatti = (ArrayList<Contact>) contactsManager.loadContacts();
            tableModel = new SimpleTableModel(contatti);
            contactsTable.setModel(tableModel);
            if(null != contatti){
                String lastUpd = Persistence.getUpdData();
                dataUpd.setText(lastUpd);
            }
            infoContact.setVisible(false);
        }
    Quello che vorrei io è che alla pressione del bottone in questione, venisse visualizzata una progressBar.

    Da quello che ho capito, al click del bottone devo far partire un altro thread. Devo quindi creare un'altra classe che mi crei sia la progressBar che questo thread?
    Cioè qui già sono in piena confusione!


  2. #2
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Intanto, invio il codice della classe che ho pensato mi serve per far partire l'altro thread.

    codice:
    public class ProgressBar_JFrame extends javax.swing.JFrame {
    
    
        UserProfile userL = Persistence.getCurrentUserProfile();
        ContactsManager contactsManager = new ContactsManager(userL);
        ArrayList<Contact> contatti = new ArrayList();
        SimpleTableModel tableModel = null;
    
        /** Creates new form ProgressBar_JFrame */
        public ProgressBar_JFrame() {
            initComponents();
    
            progressBar.setMinimum(0);
            progressBar.setMaximum(100);
            progressBar.setValue(0);
            updateContactsJTable();
            progressBar.setValue(100);
            
            
    
            //Call setStringPainted now so that the progress bar height
            //stays the same whether or not the string is shown.
            progressBar.setStringPainted(true);
    
    
            task = new Task();
            task.execute();
        }
    
        /**
         * Invoked when task's progress property changes.
         */
        public void propertyChange(PropertyChangeEvent evt) {
            if ("progress" == evt.getPropertyName()) {
                int progress = (Integer) evt.getNewValue();
                progressBar.setIndeterminate(false);
                progressBar.setValue(progress);
    //            taskOutput.append(String.format(
    //                        "Completed %d%% of task.\n", progress));
            }
        }
    
        /*
         * richiama il metodo che provvede a scaricare la lista aggiornata
         */
        public boolean updateContactsJTable(){
    
            try {
                contactsManager.update();
                return true;
            } catch (WebServiceException ex) {
               ex.printStackTrace();
            } catch (ConnectException ex) {
               ex.printStackTrace();
            }
            return false;
        }
    
        
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
           ...
        }// </editor-fold>
    
    
        private Task task;
    
        class Task extends SwingWorker<Void, Void> {
            /*
             * Main task. Executed in background thread.
             */
            @Override
            public Void doInBackground() {
                Random random = new Random();
                int progress = 0;
                //Initialize progress property.
                setProgress(0);
                //Sleep for at least one second to simulate "startup".
                try {
                    Thread.sleep(1000 + random.nextInt(2000));
                } catch (InterruptedException ignore) {}
                while (progress < 100) {
                    //Sleep for up to one second.
                    try {
                        Thread.sleep(random.nextInt(1000));
                    } catch (InterruptedException ignore) {}
                    //Make random progress.
                    progress += random.nextInt(10);
                    setProgress(Math.min(progress, 100));
                }
                return null;
            }
    
            /*
             * Executed in event dispatch thread
             */
            @Override
            public void done() {
                Toolkit.getDefaultToolkit().beep();
            }
        }
    
        /**
        * @param args the command line arguments
        */
        public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new ProgressBar_JFrame().setVisible(true);
                }
            });
        }
    
        // Variables declaration - do not modify
        private javax.swing.JPanel jPanel1;
        private javax.swing.JProgressBar progressBar;
        // End of variables declaration
    
    }
    Ma sicuramente ho scritto qualcosa di intutile perchè si vede che nn c'è alcun collegamento tra il task e quello che mi serve a me.....

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    Ma sicuramente ho scritto qualcosa di intutile perchè si vede che nn c'è alcun collegamento tra il task e quello che mi serve a me.....
    Non ho letto tutto tutto completamente ma posso dirti questo. Mi sembra di capire che vuoi usare la "bound" property progress, facendo quei setProgress(). Va bene.
    Ma nota che devi invocare addPropertyChangeListener() sul tuo oggetto SwingWorker per registrare il listener .... e ovviamente devi dichiarare di implementare PropertyChangeListener. Cose che non vedo nel tuo codice.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Se ho capito cosa mi hai detto, ho modificato come segue:

    codice:
    public ProgressBar_JFrame() {
            initComponents();
    
            progressBar.setMinimum(0);
            progressBar.setMaximum(100);
            progressBar.setValue(0);
            updateContactsJTable();
            progressBar.setValue(100);
            
            //Call setStringPainted now so that the progress bar height
            //stays the same whether or not the string is shown.
            progressBar.setStringPainted(true);
    
    
            task = new Task();
            task.addPropertyChangeListener(
                 new PropertyChangeListener() {
                     public  void propertyChange(PropertyChangeEvent evt) {
                         if ("progress".equals(evt.getPropertyName())) {
                             int progress = (Integer) evt.getNewValue();
                             progressBar.setIndeterminate(false);
                             progressBar.setValue(progress);
                         }
                     }
            });
    
            task.execute();
        }
    Sembra che funzioni, ma non visualizzo la progressBar.
    Infatti nella classe dove c'è il bottone, da cui parte tutto, ho scritto questo:

    codice:
    private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) {                                          
            setCursor(new Cursor(Cursor.WAIT_CURSOR));
            ProgressBar_JFrame progressBar1 = new ProgressBar_JFrame();
            refreshContactsJTable();
            if (progressBar1.updateContactsJTable() == false){
              ....
            }  
            setCursor(new Cursor(Cursor.DEFAULT_CURSOR));   
    }
    Cosa manca?

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    Sembra che funzioni, ma non visualizzo la progressBar.
    Cosa manca?
    Non hai mostrato per intero initComponents(). Ma ... la progress bar la inserisci fisicamente nel contenitore (content pane del JFrame o altro)?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Nel codice del button ho aggiunto questo:

    codice:
    private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) {                                          
            setCursor(new Cursor(Cursor.WAIT_CURSOR));
            ProgressBar_JFrame progressBar1 = new ProgressBar_JFrame();
            progressBar1.setVisible(true);
            refreshContactsJTable();
            if (progressBar1.updateContactsJTable() == false){
                 ....
              }
            progressBar1.dispose();
            setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            
    }
    Quando clicco sul bottone, appare prima il cursore come clessidra, poi (dopo un bel po' d secondi) appare il frame che contiene la progressBar (che però nn si vede) e poi è come se nn finisse più il processo.

    In che modo fermo il task dopo che ha eseguito quello che m serve?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    Quando clicco sul bottone, appare prima il cursore come clessidra, poi (dopo un bel po' d secondi) appare il frame che contiene la progressBar
    Innanzitutto in questo metodo sei nel contesto del EDT. Non lo devi tenere impegnato per troppo tempo. Dovresti solo settare le proprietà visuali per mostrare che è in attesa (es. cursore clessidra), creare il JFrame di progresso e avviare il thread. Basta.

    Riportare il cursore allo stato normale o altro che indica la terminazione del "lavoro" dovresti farlo nel done() del tuo SwingWorker, metodo che viene invocato nuovamente nel contesto del EDT, quindi "safe" per accedere alla interfaccia utente.

    Originariamente inviato da Cool81
    (che però nn si vede)
    Ripeto: la progress bar la aggiungi nel content pane del JFrame o pannello che sia??
    Fai una cosa del tipo es. getContentPane().add(tuaScrollBar) o simile??

    Originariamente inviato da Cool81
    e poi è come se nn finisse più il processo.

    In che modo fermo il task dopo che ha eseguito quello che m serve?
    Uscendo dal doInBackground().

    Nota che nel tutorial della Sun c'è un esempio bello e chiaro che mostra l'uso di SwingWorker e l'uso della bound property "progress": ProgressBarDemo.java
    Più di così ..... non so!
    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 L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Scusa se insisto, ma è per capire.
    Innanzitutto in questo metodo sei nel contesto del EDT. Non lo devi tenere impegnato per troppo tempo. Dovresti solo settare le proprietà visuali per mostrare che è in attesa (es. cursore clessidra), creare il JFrame di progresso e avviare il thread.
    Vedendo il codice che ho passato prima, mi limito a creare il JFrame ed è così che si avvia il thread o devo scrivere qualcos'altro?

    Riportare il cursore allo stato normale o altro che indica la terminazione del "lavoro" dovresti farlo nel done() del tuo SwingWorker, metodo che viene invocato nuovamente nel contesto del EDT, quindi "safe" per accedere alla interfaccia utente.
    ......
    Uscendo dal doInBackground().
    Ho implementato questi metodi (done() e doInBackground()) così come riportato anche dal tutorial che mi hai indicato tu, ma, sempre per capire, gli devo richiamare da qualche parte o il thread, quando viene istanziato, li richiama da solo?

    Infine, ho costruito la progressBar utilizzando l'ide di Netbeans che genera da solo il codice che cmq riporto:
    codice:
    private void initComponents() {
    
            jPanel1 = new javax.swing.JPanel();
            progressBar = new javax.swing.JProgressBar();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("Attendere prego...");
    
            org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
            jPanel1.setLayout(jPanel1Layout);
            jPanel1Layout.setHorizontalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 269, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(19, Short.MAX_VALUE))
            );
            jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
    
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(18, 18, 18)
                    .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
    
            pack();
        }// </editor-fold>
    La progressBar viene aggiunta al JFrame, ma deve essere che sbalgio qualcosa nel codice che scrivo...ma cosa?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Cool81
    Vedendo il codice che ho passato prima, mi limito a creare il JFrame ed è così che si avvia il thread o devo scrivere qualcos'altro?
    Nel metodo per l'evento del pulsante non devi fare cose del tipo:

    progressBar1.dispose();
    setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

    Cose di questo tipo per la terminazione dovranno essere fatte solo quando il worker thread è terminato.


    Originariamente inviato da Cool81
    Ho implementato questi metodi (done() e doInBackground()) così come riportato anche dal tutorial che mi hai indicato tu, ma, sempre per capire, gli devo richiamare da qualche parte o il thread, quando viene istanziato, li richiama da solo?
    Deduco che non hai ancora compreso bene quale è il ciclo di vita di uno SwingWorker.

    1) Si crea una istanza della classe che estende SwingWorker (di seguito "worker").

    2) Si invoca execute() sul worker.

    3) Il worker crea un nuovo thread nel cui contesto invoca in automatico doInBackground(). Metodo di cui devi fare l'override per eseguire il tuo "lavoro" in background.

    4) doInBackground() lavora nel contesto di un altro thread ... non del EDT. Non è "safe" accedere direttamente da qui alla interfaccia utente. Ci sono diversi modi per farlo in modo safe dal doInBackground():
    - Cambiare lo stato della proprietà 'progress' che (previa registrazione del listener) fa invocare poi propertyChange() dei listener nel contesto del EDT.
    oppure
    - Invocare publish(V...) e il worker invoca nel contesto del EDT il process(List<V>)

    5) Terminato il doInBackground() il worker invoca in automatico, nel contesto del EDT, il done(). Metodo di cui puoi fare l'override per segnalare o fare qualcosa per la terminazione.

    In pratica puoi accedere in modo "safe" alla interfaccia utente (es. aggiornare una progress bar) solo nel propertyChange(), process() e done().

    Originariamente inviato da Cool81
    Infine, ho costruito la progressBar utilizzando l'ide di Netbeans che genera da solo il codice che cmq riporto:
    Quel GroupLayout è un layout manager di una libreria esterna ... non lo conosco. Comunque ad occhio mi sembra che l'add della progress bar lo fa.
    Sicuramente c'è qualcosa che non va se dici che non la visualizza. Ma ora non ho una visiona completa di tutto il tuo codice. E quindi non so dire.

    Non è difficile ... c'è l'esempio, c'è il tutorial ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it L'avatar di Cool81
    Registrato dal
    Dec 2008
    Messaggi
    160
    Lo so che ci sono tutorial ed esempi, ma non riesco proprio ad applicarlo.

    Da quello che mi dici tu, dovrei istanziare un oggetto che estende SwingWorker all'evento del premere il button e poi questo oggetto che costituisce il thread, chiamando da solo i metodi doInBackground() e done(), eseguirà il compito richiesto. Quindi una volta eseguito il done, il processo torna nella mani dell'EDT, giusto?

    Ma se io ho implementato quest'oggetto che estende le SwingWorker in un'altra classe, in particolare in questa:

    codice:
    import java.awt.Toolkit;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.net.ConnectException;
    import java.util.ArrayList;
    import javax.xml.ws.WebServiceException;
    import org.jdesktop.swingworker.SwingWorker;
    import rubrica.bean.UserProfile;
    import rubrica.jaxb.Contact;
    import rubrica.manager.ContactsManager;
    import rubrica.service.Persistence;
    
    
    public class UpdateContactsThread_JFrame extends javax.swing.JFrame {
    
    
        UserProfile userL = Persistence.getCurrentUserProfile();
        ContactsManager contactsManager = new ContactsManager(userL);
        ArrayList<Contact> contatti = new ArrayList();
        SimpleTableModel tableModel = null;
    
        /** Creates new form UpdateContactsThread_JFrame */
        public UpdateContactsThread_JFrame() {
            initComponents();
    
            progressBar.setMinimum(0);
            progressBar.setMaximum(100);
          
            //Call setStringPainted now so that the progress bar height
            //stays the same whether or not the string is shown.
            progressBar.setStringPainted(true);
    
            task = new Task();
            task.addPropertyChangeListener(
                 new PropertyChangeListener() {
                     public  void propertyChange(PropertyChangeEvent evt) {
                         if ("progress".equals(evt.getPropertyName())) {
                             int progress = (Integer) evt.getNewValue();
                             progressBar.setIndeterminate(false);
                             progressBar.setValue(progress);
                         }
                     }
            });
    
            task.execute();
    
        }
    
        
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {
    
            jPanel1 = new javax.swing.JPanel();
            progressBar = new javax.swing.JProgressBar();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("Attendere prego...");
    
            org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
            jPanel1.setLayout(jPanel1Layout);
            jPanel1Layout.setHorizontalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 269, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(19, Short.MAX_VALUE))
            );
            jPanel1Layout.setVerticalGroup(
                jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(jPanel1Layout.createSequentialGroup()
                    .addContainerGap()
                    .add(progressBar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
    
            org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .add(18, 18, 18)
                    .add(jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                .add(layout.createSequentialGroup()
                    .addContainerGap()
                    .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
    
            pack();
        }// </editor-fold>
    
    
        private Task task;
    
        class Task extends SwingWorker<SimpleTableModel, Void> {
            /*
             * Main task. Executed in background thread.
             */
            @Override
            public SimpleTableModel doInBackground() {
                 try {
      
                    contactsManager.update();
                    contatti = (ArrayList<Contact>) contactsManager.loadContacts();
                    tableModel = new SimpleTableModel(contatti);
                    return tableModel;
                } catch (WebServiceException ex) {
                    ex.printStackTrace();
                } catch (ConnectException ex) {
                    ex.printStackTrace();
                }
                return null;
            }
    
            /*
             * Executed in event dispatch thread
             */
            @Override
            public void done() {
                Toolkit.getDefaultToolkit().beep();
                setCursor(null); //turn off the wait cursor
            }
        }
    
        // Variables declaration - do not modify
        private javax.swing.JPanel jPanel1;
        private javax.swing.JProgressBar progressBar;
        // End of variables declaration
    
    }
    Ho sovrascritto i metodi doInBackground() e done() per come mi servono a me. In particolare, al primo faccio restituire un SimpleTableModel che vorrei poi fosse passato all'EDT per aggiornare un componente dell'interfaccia. Dovrei usare il metodo publish(), ma dove lo devo mettere? nel doInBackground() o altrove?

    E poi nell'interfaccia principale dove è presente il button cliccando il quale deve partire questo thread che mi dovrebbe visualizzare la progressBar per la durata del suo processo, oltre questo:

    codice:
    private void btnUpdateActionPerformed(java.awt.event.ActionEvent evt) {                                          
            btnUpdate.setEnabled(false);
            setCursor(new Cursor(Cursor.WAIT_CURSOR));
            UpdateContactsThread_JFrame updateThread = new UpdateContactsThread_JFrame();
            updateThread.setVisible(true);
    
    }
    Cosa ci devo scrivere?


    E' vero che ci sono esempi e tutorial, ma ripeto non riesco ad applicarmi al mio caso, forse semplicemente perchè tutto ciò che è presente in internet esegue tutto in una sola classe e quindi ha tutto lì a portata di mano, io no.

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.