Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Aiuto progressBar
Forum - Java - Aiuto progressBar

Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 1:07
Giovedì, 22/05/2008
Codice sorgente - presumibilmente Java

  1. while (true){
  2.            int read = stream.read(buffer);
  3.            
  4.            if (read == -1){
  5.                break;
  6.            }
  7.            file.write(buffer, 0, read);
  8.            lenFile = file.length();          
  9.            lenKbFile = (int) (lenFile / 1024);
  10.            final int percent = lenKbFile;
  11.            try{
  12.            System.out.println("scaricato: "+lenKbFile+"/"+contentLenght/1024);
  13.            
  14.            SwingUtilities.invokeLater(new Runnable(){
  15.                public void run(){
  16.                DownloadManView.jProgressBar1.setValue(percent);
  17.                DownloadManView.jProgressBar1.repaint();
  18.                 }
  19.            });
  20.            java.lang.Thread.sleep(100);
  21.            
  22.                 }catch(InterruptedException e){;}
  23.        }
  24.            
  25.     }



Ho inserito in un ciclo di uno pseudo download manager una progress bar ma non riesco a farla funzionare, in pratica avvio il programma, avvio lo scaricamento, funziona, ma la progressbar sta ferma, allafine dello scaricamento va diretta al 100%.. e quindi non si vede il caricamento...
sapete aiutarmi??.. le ho provate tutte...:k::k:

Ultima modifica effettuata da total il 22/05/2008 alle 1:17
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 14:54
Giovedì, 22/05/2008
Intanto una piccola correzzione al codice per renderlo sintatticamente più corretto:

Codice sorgente - presumibilmente Java

  1. int read = stream.read(buffer);
  2. while (read != -1){
  3. read = stream.read(buffer);



Così togli il break (quelli degli if con il break per uscire dal ciclo è una tecnica che andrebbe evitata quando possibile in Java).

Poi per ottimizzare alcune righe di codice possono essere trasportate fuori dal ciclo in quanto non serve ricalcolarle ad ogni iterazione:

Codice sorgente - presumibilmente Java

  1. lenFile = file.length(); //non varia
  2. lenKbFile = (int) (lenFile / 1024); //nemmeno
  3.  
  4. int read = stream.read(buffer);
  5. while (read != -1){
  6. read = stream.read(buffer);
  7. //...



Poi il calcolo di percent mi sembra sbagliato (poi perchè lo dichiari come final?)

I dati che ti servono sono:

Quantità di bytes totali (lenFile)
Quantità di bytes scaricati (aggiungi una nuova variabile int bytesDownloaded inizializzata a zero)

Da cui deriva la semplice proporzione:

100 : lenFile = percent : bytesDownloaded

percent = 100*bytesDownloaded / lenFile

Nel codice ovviamente ogni volta che leggi i dati:

Codice sorgente - presumibilmente Java

  1. //...
  2. int bytesDownloaded = 0;
  3. //...
  4. while (read != -1){
  5. read = stream.read(buffer);
  6. bytesDownloaded += read;



Il divertimento di scrivere il codice finale e funzionamente ovviamente lo lascio a te. ;)


Il mio blog: https://piero.dev
PM Quote
Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 16:59
Giovedì, 22/05/2008
Codice sorgente - presumibilmente Java

  1. int read = stream.read(buffer);
  2. while (read != -1){
  3. read = stream.read(buffer);



mi piace.. funziona e hai ragione^^

Testo quotato

Poi il calcolo di percent mi sembra sbagliato (poi perchè lo dichiari come final?)

I dati che ti servono sono:

Quantità di bytes totali (lenFile)
Quantità di bytes scaricati (aggiungi una nuova variabile int bytesDownloaded inizializzata a zero)

Da cui deriva la semplice proporzione:

100 : lenFile = percent : bytesDownloaded

percent = 100*bytesDownloaded / lenFile



lenFile è la lunghezza del file vuoto che ho creato quindi mi indica la quantità di bytes scaricati... che ha la stessa funzione quindi di bytesDownloaded,

settando la grandezza della progressbar in questo modo :
Codice sorgente - presumibilmente Java

  1. DownloadManView.jProgressBar1.setMinimum(1);
  2.        DownloadManView.jProgressBar1.setMaximum(contentLenght/1024);// dove contentLenght e la grandezza del file in byte


non credo serva la proprorzione che mi hai consigliato (che in ogni caso ho provato ma non riesco comunque a farla funzionare)

mentre percent devo dichiararlo come final per non incorrere in quest'errore di compilazione:

DownloadManView.jProgressBar1.setValue(percent);
1 error
BUILD FAILED (total time: 0 seconds)

methdown.java:90: local variable percent is accessed from within inner class; needs to be declared final

In ogni caso ho provato molte cose ho cercato su news group, sul sito di SUn e nella reference completa della 0'reilly sulle swing....  credo ci sia un erroraccio logico da qualche parte...


8-|8-|

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 17:35
Giovedì, 22/05/2008
Prova allora a richiamare flush() subito dopo l'operazione di write:

Codice sorgente - presumibilmente Plain Text

  1. file.write(buffer, 0, read);
  2. file.flush();





Il mio blog: https://piero.dev
PM Quote
Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 18:35
Giovedì, 22/05/2008
mi da errore flush() ma in ogni caso credo che ci siamo fraintesi.. l'errore è solo nella gui perchè per il resto funziona, infatti

Codice sorgente - presumibilmente Plain Text

  1. System.out.println("scaricato: "+lenKbFile+"/"+contentLenght/1024);



mi restituisce ad esempio:
scaricato: 123/2349
scaricato: 124/2349
scaricato: 125/2349
ecc...ecc..

in piu o meno tutti i metodi che ho provato
ma la gui rimane ferma, solo alla fine del download la progressbar mi si riempie al suo 100% e termina cosi l'esecuzione....

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:07
Giovedì, 22/05/2008
Ahhh ok!

Penso il problema sia SwingUtilities.invokeLater. Sicuro di aver letto bene come funziona?

Io ti consiglierei di usare semplicemente la classe Thread:

Codice sorgente - presumibilmente Java

  1. new Thread(new Runnable() {
  2.   public void run() {
  3.     // do it…
  4.   }
  5. }).start();



Il mio blog: https://piero.dev
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 12:04
Domenica, 25/05/2008
prova non dichiarare la classe interna in invokeLater, fai implementare Runnable alla tua classe e passa this al metodo (o crea una classe ad hoc se preferisci ma mi sembra ridondante).
A questo punto potrai inserire nel codice di run direttamente la variabile senza dichiararla final (questo vale anche se usi la classe Thread direttamente o altre classi in modo anonimo).

PM Quote
Avatar
total (Member)
Guru


Messaggi: 815
Iscritto: 16/09/2006

Segnala al moderatore
Postato alle 14:00
Domenica, 25/05/2008
Grazie ... ho provato anche queste 2(quella che mi ha suggerito net l'avevo già provata qualche tempo fa senza risultati) e non riesco a farla andare.... e sinceramente... ha vinto lei questa prima battaglia...

jProgressBar : 1  total : 0

Vedrò appena avrò dieci minuti di voglia di rimettermi e riprovarci...se scoprirò l'errore lo posto qua... grazie ancora

PM Quote