Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di softoxy
    Registrato dal
    Apr 2001
    Messaggi
    202

    [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.
    Soft!2001

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472

    Moderazione

    Sposto nel forum dedicato a Java.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Innanzitutto l'intero ciclo while va inserito all'interno di un thread.
    Poi, il metodo paint() dei componenti non deve mai e poi mai essere chiamato direttamente. Per forzare il sistema a ridisegnare il componente di utilizza repaint(). Ad ogni modo, non dovrebbe essere necessario richiamare il ridisegno del componente. Dovrebbe automaticamente essere richiamato da setValue().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di softoxy
    Registrato dal
    Apr 2001
    Messaggi
    202

    ..............

    Grazie per la risposta.
    Quindi provo prima di tutto ad utilizzare il repaint, perchè con il semplice setValue mi fa vedere solamente 0% e 100%, dopodichè provo a creare il thread e metterci il ciclo.
    Nel thread gli devo passare le componenti utlizzate come la jProgressBar?
    Soft!2001

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Il motivo per il quale ti mostra solo 0% e 100% è dovuto al fatto che il refresh avviene solo quanto il ciclo while è terminato. Il tuo ciclo while, infatti, impegna al 100% la classe della finestra che non viene mai ridisegnata finchè il metodo non termina.
    Inserendolo, invece, in un thread non avrai più bisogno del repaint() poichè la finestra viene lasciata libera.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it L'avatar di softoxy
    Registrato dal
    Apr 2001
    Messaggi
    202

    ........

    Grazie mille per l'ottima ed esauriente spiegazione.

    A presto!
    Soft!2001

  7. #7
    Utente di HTML.it L'avatar di softoxy
    Registrato dal
    Apr 2001
    Messaggi
    202

    .......

    Oddio l'ho fatto, ma si blocca dicendo "bad file descriptor".

    Ho creato una classe pe il ciclo while Runnable (implements Runnable ). Passo al costruttore i paramentri che mi servono e la richiamo cosi:

    is FileInputStream, os OutputStream, buteTotal sono la dimensione del file

    InviaFile iFile = new InviaFile(is, os, jProgressBarFTP, byteTotal);
    Thread t = new Thread(iFile);
    t.start();

    il ciclo del while è lo stesso:
    try {
    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
    }
    }
    }
    catch (IOException e) {
    JOptionPane.showMessageDialog(null, e);
    }

    Come mai?????
    Soft!2001

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    L'errore indica che stai tentando di leggere da un oggetto che non punta ad un file valido... ad ogni modo, dovresti togliere la chiamata al metodo paint().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di softoxy
    Registrato dal
    Apr 2001
    Messaggi
    202

    ..........

    No scusami, hai ragione, ho copiato il pezzo di codice differente ho messo il repaint
    try {
    while (true) {
    c = is.read();
    if (c < 0)
    break;
    os.write(c);
    numByte++;
    percentualeStatus = (int)Math.round(((numByte) / byteTotal) * 100);
    //textField1.setText(String.valueOf(numBuyte));
    //System.out.println(percentualeStatuts);
    if (percentualeStatus != percentualeStatusOld) {
    jProgressBar.setValue(percentualeStatus);
    percentualeStatusOld = percentualeStatus;
    jProgressBar.repaint(); <<------------------------------------------------
    //jProgressBarFTP.paint(jProgressBarFTP.getGraphics( ));
    }
    }
    }
    catch (IOException e) {
    JOptionPane.showMessageDialog(null, e);
    }

    ed ho sostituito il metodo load con run.
    Mi invia il file, ma la progressBar rimane ferma.... adesso tolgo anche il repaint.
    Soft!2001

  10. #10
    Utente di HTML.it L'avatar di softoxy
    Registrato dal
    Apr 2001
    Messaggi
    202

    ...............

    Il problema più grosso è che mi da un errore sulla scrittua del socket e mi blocca il servizio di rete.
    Devo riavviare il computer se voglio navigare su internet. Se uso net stop e net start non ho miglioramenti.
    Sapete come posso ripristinare la rete o chiudere il socket impegnato?
    Soft!2001

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.