Torna indietro   Hardware Upgrade Forum > Software > Programmazione

TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita
TCL P80 Ultra abbina per la prima volta un pannello AMOLED alla tecnologia NXTPAPER con finitura opaca, affiancandoci una fotocamera periscopica da 50 MP con zoom ottico 3x, il SoC Dimensity 7400 Elite e una batteria da 5.800 mAh. Nella prova sul campo emergono luminosità di picco molto elevata, comparto fotografico solido per la fascia di prezzo e autonomia nella media, a fronte di velocità di scrittura dello storage piuttosto contenute
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio
HUAWEI MatePad Air combina diverse carte molto interessanti: un OLED PaperMatte da 12 pollici, un corpo sottile e una tastiera molto comoda. Durante la prova abbiamo apprezzato fluidità, audio e comfort visivo, mentre i test hanno chiarito pregi e qualche limite nelle prestazioni. L'autonomia ha convinto anche nell'uso intermittente; la scelta passa dalla compatibilità delle proprie app e dal valore del pacchetto con accessori, proposto a 749 euro
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica
Debuttano ufficialmente i primi sistemi notebook basati su piattaforma NVIDIA RTX Spark, abbinati a Windows on ARM e pensati per l'intelligenza artificiale agentica. Architettura integrata tra CPU e GPU che condividono la memoria di sistema, capace di gestire in locale modelli molto grandi ma al contempo anche di spiccare con la grafica e l'elaborazione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-05-2006, 10:51   #1
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
[JAVA]Componente progress bar sfarfalla

Ho creato un programmino che effettua l'FTP comprensivo di stato di avanzamento del processo tramite componente JProgressBar.
La progress bar l'ho inserita all'interno di un ciclo while che invia byte per byte il file.
Il problema è l'effetto sfarfallio che si ottiene quando viene ridisegnata ogni volta la progress bar.

while (true) {
c = is.read(); // LEGGO DAL FILE BYTE PER BYTE
if (c < 0)
break;
os.write(c);
numByte++;
percentualeStatus = (int)Math.round(((numByte) / byteTotal) * 100);

if (percentualeStatus != percentualeStatusOld) {
jProgressBarFTP.setValue(percentualeStatus); // SETTO IL VALORE IN PERCENTUALE
percentualeStatusOld = percentualeStatus;
jProgressBarFTP.paint(jProgressBarFTP.getGraphics()); //RIDISEGNO IL COMPONENTE
}
}

Come posso togliere lo sfarfallio? Per mezzo di un thread? Ma in corrispondenza solo del ridisegnamento del componente?

Aiuto, grazie.
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2006, 16:04   #2
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da softoxy
...omissis...
Come posso togliere lo sfarfallio? Per mezzo di un thread? Ma in corrispondenza solo del ridisegnamento del componente?

Aiuto, grazie.
Ciao,
in effetti e' la soluzione migliore: crei un nuovo thread ed all'interno di quest'ultimo esegui le operazione di lettura dalla rete, mentre il thread principale sara' libero di rinfrescare la tua progress bar.
In questo modo non solo elimini la paint(), causa dei tuoi problemi: puoi anche integrare la tua progress bar in un dialogo/frame con un bottone "Cancella" per fermare l'esecuzione (ti basta una semplice variabile booleana).

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 09-05-2006, 21:59   #3
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Questa riga

jProgressBarFTP.paint(jProgressBarFTP.getGraphics()); //RIDISEGNO IL COMPONENTE

è un po' anomala.

L'invocazione di setValue provvede in via autonoma ad aggiornare l'aspetto della barra di progresso.

Nel caso in cui non provveda c'è qualcosa che non va. Una svista tipica è l'invocazione di "setValue" ad opera di un Thread diverso dallo AWT Event Dispatcher Thread. E' possibile (solo possibile) che sia il tuo caso perchè leggo che maneggi byte lungo un flusso, cosa a cui si deve dedicare un Thread certamente diverso dall'Event Dispatcher. In questo caso circondi l'invocazione che aggiorna il componente AWT/Swing con uno:

Codice:
//final value = percentualeStatus;
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        jProgressBarFTP.setValue(value);
    }
});
Sinteticamente, "invokeLater" fa sì che il metodo "run" del Runnable che riceve come argomento sia eseguito da quell'unico Thread (Event Dispatcher) che può e deve produrre un corretto aggiornamento grafico dei componenti.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 14:59   #4
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
.............

Grazie per le risposte.
Avevo già provato a far girare il ciclo while() all'interno di un thread, ma non funziona. Mi da lo stesso errore se inserisco il pezzo di codice suggeritomi da PGI-Bis, errore di scrittura sul socket e mi blocca la rete.
Non posso più accedere alla rete.
Come posso ripristinare lo stato iniziale? Io ho provato con net stop e net start, ma non ha effetto, devo riavviare la macchina per avere risultati.
Bà????
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 15:45   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da softoxy
Grazie per le risposte.
Avevo già provato a far girare il ciclo while() all'interno di un thread, ma non funziona. Mi da lo stesso errore se inserisco il pezzo di codice suggeritomi da PGI-Bis, errore di scrittura sul socket e mi blocca la rete.
Non posso più accedere alla rete.
Come posso ripristinare lo stato iniziale? Io ho provato con net stop e net start, ma non ha effetto, devo riavviare la macchina per avere risultati.
Bà????
Il suggerimento di PGI-Bis e' corretto (come sempre). E' probabile che ci sia qualcos'altro da controllare. Se vuoi, pubblica il codice, lo guardiamo insieme.
Cmq alcuni suggerimenti:
- per quanto riguarda lo spostamento del ciclo while all'interno di un thread, e' la soluzione che adotto praticamente sempre. Non ho voglia di inventare cose nuove, per cui uso sempre quella in quanto e' semplice e robusta.
- Ovviamente l'apertura di un eventuale dialogo di attesa, con la relativa JProgressBar NON deve esser fatta in quel thread: se vuoi aprire una simile finestra, lo dovrai fare dal thread principale.
- La rete non viene influenzata da questo. Pubblica il codice, vediamo di risolvere. Beh, a dire il vero ora vado a dormire, ma su questo forum c'e' sicuramente gente molto piu' in gamba di me che ti sa aiutare....

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 15:59   #6
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
..............

ok, non sono d'accordo sul mettere tutto il codice, perchè penso che sia fastidioso leggere tutte queste righe, ma se tu mi dici che le leggeranno...

metto solo il metodo che implementa l'invio del file in ftp, la jProgressBar è nella classe che richiama questo metodo:

private void inviaFileFTP (String pathFile) {
double byteTotal = 0;
String fileName = "";
int errorConnect;
int percentualeStatusOld = 0;

errorConnect = FTPConnect (utente.getFtpConfig().getHost(), utente.getFtpConfig().getUser(), utente.getFtpConfig().getPass());
if (errorConnect > 0 && errorConnect != 230) {
return ;
}

String file_da_aprire = pathFile;
File inputFile = new File(file_da_aprire);

byteTotal = inputFile.length();
fileName = inputFile.getName();

textAreaFTP.append("transfert: " + fileName + " " + String.valueOf(byteTotal) + " byte\r\n");

OutputStream os = null;
FileInputStream is = null;

try {
ftp.setFileType( FTPClient.BINARY_FILE_TYPE );
int indexToken = fileName.lastIndexOf(".");

String ext = fileName.substring(indexToken);
newNameFile = "FILE_" + DateUtilities.getString(materiale.getDataPubblicazione()) + ext;

os = ftp.storeFileStream(newNameFile);

is= new FileInputStream( file_da_aprire);
int c;
int numByte = 0;

jProgressBarFTP.setValue(0);
jProgressBarFTP.setStringPainted(true);


while (true) {
c = is.read();
if (c < 0)
break;
os.write(c);
numByte++;
final int percentualeStatus = (int)Math.round(((numByte) / byteTotal) * 100);
//textField1.setText(String.valueOf(numBuyte));
//System.out.println(percentualeStatuts);
if (percentualeStatus != percentualeStatusOld) {
jProgressBarFTP.setValue(percentualeStatus);
/*
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jProgressBarFTP.setValue(percentualeStatus);
}
});
*/
percentualeStatusOld = percentualeStatus;

//jProgressBarFTP.paint(jProgressBarFTP.getGraphics());
}
}


//InviaFile iFile = new InviaFile(is, os, jProgressBarFTP, byteTotal);
//Thread t = new Thread(iFile);
//t.run();
os.close();
is.close();

textAreaFTP.append(ftp.getReplyString());


}
catch (Throwable t) {
MessageDialog.throwable(this, t);
}

FTPDisconnect ();

}

}
__________________
SoftOXY!2004

Ultima modifica di softoxy : 10-05-2006 alle 16:01.
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:05   #7
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da softoxy
ok, non sono d'accordo sul mettere tutto il codice, perchè penso che sia fastidioso leggere tutte queste righe, ma se tu mi dici che le leggeranno...

metto solo il metodo che implementa l'invio del file in ftp, la jProgressBar è nella classe che richiama questo metodo:

... omissis ...

}
Buon codice. Tuttavia le parole che hai scritto sopra sembrano piu' interessanti:
Quote:
Originariamente inviato da softoxy
la jProgressBar è nella classe che richiama questo metodo
Se si tratta dello stesso thread, allora non hai chance di aggiornare correttamente la jprogress bar, in quanto terrai questo thread "fermo" nella tua funzione. La tua funzionalita' deve quindi essere spostata in un altro thread e lasciare che il thread che gestisce la jProgressBar possa ritornare il controllo alla virtual machine, la quale provvedera' all'aggiornamento.
In alternativa, usa il codice di PGI-Bis, ma ti consiglio vivamente di fare questa funzione in un thread separato. Si tratta di poco lavoro....

Per quanto riguarda la rete, non vedo alcun problema. Purtroppo non ho il tempo di fare prove...

High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:10   #8
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
..........

Grazie, grazie ancora.
Eppure ogni volta che metto il codice di PGI o se vedi la parte commentata c'era un therad che faceva il ciclo, mi blocca la rete.
I canali os e is li chiudo, forse devo chiuderli all'interno del thread, adesso provo

Ancora grazie.
__________________
SoftOXY!2004

Ultima modifica di softoxy : 10-05-2006 alle 16:30.
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:33   #9
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
.........

si funziona, mettendo la chiusura dei canali is ed os all'interno del thread l'invio del file avviene e si chiudono senza bloccarmi la rete, solamente il thread sembra essere sempre bloccante, perchè la jProgressBar non si visualizza se non alla fine (100%).
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:44   #10
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
............

La classe InviaFile

package it.computime.object;
import cfc.swing.MessageDialog;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

public class InviaFile implements Runnable {
int c;
int numByte = 0;
int percentualeStatus = 0, percentualeStatusOld = 0;
FileInputStream is = null;
OutputStream os = null ;
JProgressBar jProgressBar = null;
double byteTotal = 0;

public InviaFile(FileInputStream is, OutputStream os, JProgressBar jProgressBar, double byteTotal) {
this.is = is;
this.os = os;
this.jProgressBar = jProgressBar;
this.byteTotal = byteTotal;
}

public void run() {
try {
while (true) {
c = is.read();
if (c < 0)
break;
os.write(c);
numByte++;
percentualeStatus = (int)Math.round(((numByte) / byteTotal) * 100);

if (percentualeStatus != percentualeStatusOld) {
jProgressBar.setValue(percentualeStatus);
percentualeStatusOld = percentualeStatus;
jProgressBar.repaint();
}
}
os.close();
is.close();
}
catch (IOException e) {
JOptionPane.showMessageDialog(null, e);
}
}
}
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:53   #11
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
......

.l'errore è nel far partire il thread con run, ecco perchè è bloccante.
Devo farlo partire con il metodo start(), però mi dice "Bad File Descriptor"
eppure il file è is............?????
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 10-05-2006, 16:55   #12
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
........

forse ho capito, perchè chiuso subito il canale, il thread parte e io gli chiudo il canale sotto... il puzzle si chiude!
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
Old 11-05-2006, 10:28   #13
softoxy
Member
 
Iscritto dal: Aug 2004
Messaggi: 83
Risolto.
Ho sbagliato di concetto.
Io pensavo di dover mettere nel thread solo il ciclo while, ma da come si vede nel metodo, si aprono canali e si chiudono al termine dell'operazione.
Mettendo tutte le operazioni del metodo all'interno del thread e spostando l'intero controllo dell'operazione al thread, funziona tutto benissimo.
E' vero, la finestra principale ha la possibilità di ridisegnarsi, quindi spostando anche la finsestra la progressBar non sfarfalla (utilizzando solamente setValue()) e indica il progresso del processo.

Grazie per i fantastici aiuti.
__________________
SoftOXY!2004
softoxy è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita TCL P80 Ultra: con un display AMOLED opaco &egra...
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
NVIDIA RTX Spark: il PC Windows on ARM costruito per l'IA agentica NVIDIA RTX Spark: il PC Windows on ARM costruito...
Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
iPhone Duo, svelata la capacità d...
Samsung Galaxy S27: lancio anticipo per ...
Starlink ha quattro nuovi rivali in Euro...
Le 3 stampanti più vendute su Ama...
Call of Duty: Modern Warfare 4 rende oma...
Il MIT lascia 13 copie di Claude Opus 4....
CXMT punta a produrre 600.000 wafer DRAM...
'Windows open source' fa un altro passo ...
XPENG porta Google Play a bordo: app e i...
Bestseller auricolari Amazon: i 5 modell...
Il satellite spia russo Kosmos 2612 si s...
CrowdStrike mette l’IA contro l’IA: un m...
SAP NOW AI Tour, l'impresa autonoma pass...
Amazon Luna arriva su Prime Video: cloud...
HomeView, Apple pensa già al braccio rob...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:48.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v