total (Member)
Guru
Messaggi: 815
Iscritto: 16/09/2006
|
Codice sorgente - presumibilmente Java |
while (true){ int read = stream.read(buffer); if (read == -1){ break; } file.write(buffer, 0, read); lenFile = file.length(); lenKbFile = (int) (lenFile / 1024); final int percent = lenKbFile; try{ System. out. println("scaricato: "+lenKbFile +"/"+contentLenght /1024 ); public void run(){ DownloadManView.jProgressBar1.setValue(percent); DownloadManView.jProgressBar1.repaint(); } }); } }
|
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...
Ultima modifica effettuata da total il 22/05/2008 alle 1:17 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Intanto una piccola correzzione al codice per renderlo sintatticamente più corretto:
Codice sorgente - presumibilmente Java |
int read = stream.read(buffer); while (read != -1){ 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 |
lenFile = file.length(); //non varia lenKbFile = (int) (lenFile / 1024); //nemmeno int read = stream.read(buffer); while (read != -1){ read = stream.read(buffer); //...
|
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 |
//... int bytesDownloaded = 0; //... while (read != -1){ read = stream.read(buffer); bytesDownloaded += read;
|
Il divertimento di scrivere il codice finale e funzionamente ovviamente lo lascio a te.
|
|
total (Member)
Guru
Messaggi: 815
Iscritto: 16/09/2006
|
Codice sorgente - presumibilmente Java |
int read = stream.read(buffer); while (read != -1){ read = stream.read(buffer);
|
mi piace.. funziona e hai ragione^^
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 |
DownloadManView.jProgressBar1.setMinimum(1); 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...
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Prova allora a richiamare flush() subito dopo l'operazione di write:
Codice sorgente - presumibilmente Plain Text |
file.write(buffer, 0, read);
file.flush();
|
|
|
total (Member)
Guru
Messaggi: 815
Iscritto: 16/09/2006
|
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 |
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....
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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 |
public void run() { // do it… } }).start();
|
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
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).
|
|
total (Member)
Guru
Messaggi: 815
Iscritto: 16/09/2006
|
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
|
|