Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Aiuto JProgressBar

  1. #1

    Aiuto JProgressBar

    Ciao a tutti, questo è il mio primo messaggio nel forum, spero di non esordire nel peggiore dei modi

    Vi scrivo perchè ho un problemino di cui non riesco a venir a capo ormai da un paio di giorni. Ho creato un'applicazione che permette vari tipi di sincronizzazione di files e cartelle.
    L'algoritmo che ho scritto esamina le cartelle in modo ricorsivo, quindi non si può sapere in anticipo quanto ci metterà (e neanche mi interessa).
    Avevo quindi pensato di mettere una JProgressBar indeterminata che compare per indicare all'utente che il programma non è crashato ma sta lavorando e scompare quando la sincronizzazione è terminata.

    Mi sono letto tutta la documentazione e tutti i vari esempi, ho creato un nuovo task estendendo SwingWorker e implementando la classe del JFrame con PropertyChangeListener. Però proprio non capisco come chiamare il metodo propertyChange all'inizio della sincronizzazione. (per far sparire la barra lo faccio nel metodo done() e non dovrei avere problemi..)

    Se serve poso il codice...



    Grazie in anticipo per l'aiuto.

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157

    Re: Aiuto JProgressBar

    Originariamente inviato da marczxc
    Ciao a tutti, questo è il mio primo messaggio nel forum, spero di non esordire nel peggiore dei modi
    Mi sono letto tutta la documentazione e tutti i vari esempi, ho creato un nuovo task estendendo SwingWorker e implementando la classe del JFrame con PropertyChangeListener. Però proprio non capisco come chiamare il metodo propertyChange all'inizio della sincronizzazione. (per far sparire la barra lo faccio nel metodo done() e non dovrei avere problemi..)
    posta il codice, ho usato molto swingworker e non ho capito che intendi

  3. #3

    Re: Re: Aiuto JProgressBar

    Originariamente inviato da valia
    posta il codice, ho usato molto swingworker e non ho capito che intendi
    Ok, il problema è che quella parte di codice è sbagliata/ancora da scrivere, perchè ho provato con un po' di esempi ma non ci sono riuscito.

    Questa parte è l'inizio della classe del frame (ci sono solo alcune delle variabili d'istanza) con la classe Task inserita all'interno:
    codice:
    public class toSync extends javax.swing.JFrame implements PropertyChangeListener {
    
        private JFileChooser fc;
        private File source, dest;
        private boolean enableBackup, enableReciprocal, enableOldBackup; //boolean for radiobutton
        private Task task;
        private boolean working;
    
        class Task extends SwingWorker<Void, Void> {
            /*
             * Main task. Executed in background thread.
             */
            @Override
            public Void doInBackground() {
                //Random random = new Random();
                int progress = 0;
                working = true;
                //Initialize progress property.
                setProgress(100);
    
                while (working) {
    	        /*System.out.println(progress);
                    //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 dispatching thread
             */
            @Override
            public void done() {
                System.out.println("entrato in done()");
                progressBar.setVisible(false);
                Toolkit.getDefaultToolkit().beep();
                syncButton.setEnabled(true);
                setCursor(null); //turn off the wait cursor
            }
        }
    questo invece è il codice del metodo propertyChange:
    codice:
    public void propertyChange(PropertyChangeEvent evt) {
            System.out.println("entrato in propertyChange(), non if");
            if (working) {
    	    System.out.println("entrato in propertyChange(), anche nell'if");
                progressBar.setVisible(true);
            }
        }
    questo invece il metodo listener del pulsante di sincronizzazione, che quando schiacciato dovrebbe comparire la barra e quando invece viene disallocato dovrebbe scomparire:
    codice:
    private void syncButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
            syncButton.setEnabled(false);
            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            //Instances of javax.swing.SwingWorker are not reusuable, so
            //I create new instances as needed.
            task = new Task();
            task.addPropertyChangeListener(this);
            task.execute();
            try {
                //progressBar.setStringPainted(true);
                //progressBar.setIndeterminate(true);
                if(enableReciprocal)
                    Code.reciprocal(source, dest, log);
                else if(enableOldBackup)
                    Code.oldBackup(source, dest, log);
                else if(enableBackup)
                    Code.backup(source, dest, log);
                //progressBar.setStringPainted(false);
                //progressBar.setIndeterminate(false);
                working = false;
                FrameLog.setVisible(true);
    
            } catch(IOException error) {
                System.out.println("I/O Error");
            }
        }

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    sarò scema io ma non ho ancora capito cosa non fa il listener che dovrebbe fare (secondo te).
    Che intendi con "chiamare il metoto propertyChange all'inizio della sincronizzazione"?

    il propertychangelistener è un ascoltatore di eventi, in pratica riguarda le properties (in dettaglio quelle dello swingworker).
    Ora se ti interessa settare, inizializzare qualcosa (che usi nello swingworker) devi farlo nel costruttore dello swingworker (è più logico) in quanto questo listener entra in gioco coi cambiamenti.

    guarda qui se ti può tornare utile

    http://www.java2s.com/Tutorial/Java/...wingworker.htm

    e ti riporto un po della doc ufficiale

    A SwingWorker instance can notify listeners when its properties change. A SwingWorker instance has two important properties: state and progress.

    A worker thread has several states, represented by the following SwingWorker.StateValue enumeration values:

    * PENDING
    * STARTED
    * DONE

    A worker thread is in the PENDING state immediately after its creation. When the doInBackground method begins, the worker thread enters the STARTED state. A worker thread is in the DONE state after its doInBackground method finishes. The SwingWorker superclass sets these state values automatically as it moves through its life cycle. You can add listeners that receive notification when this property changes.

    Finally, a worker object has a progress property. As the worker progresses, it can update this property with integer values from 0 through 100. The worker can notify listeners when this property changes.

    che trovi qui

    http://java.sun.com/developer/techni...e/swingworker/

    spero che aiuta a risolverti il problema perché onestamente io non ho capito a cosa ti riferisci

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.