Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema con ProgressBar

    Salve!

    Ho un problema con ProgressMonitor...

    All'interno di una classe mainWindow che estende JFrame, creo

    monitor = new ProgressMonitor(this, "Prova", "Creating universe...",0,200);
    monitor.setMinimum(0);
    monitor.setMaximum(100);

    Dopodichè, io vorrei che, al'interno di un ciclo for chiamato dentro un'altra funzione, ad ogni
    iterazione del for

    ...
    Threads.sleep(10);
    mainWindow.monitor.setProgress(i);
    ...

    Il problema è che il progress bar viene visualizzato vuoto Quando finisce il ciclo for viene visualizzato con la barra completa.

    Qualcuno può darmi una mano?

    (scusate se riedito ma nessuno a risposto finora... )

  2. #2
    Il tuo codice aggiorna la progressbar ogni 10 millisecondi

    Forse intendevi usare:
    codice:
    Thread.sleep(10000);
    lolide
    Java Programmer

    Informati

  3. #3
    OK, grazie mille, ora provo.

  4. #4
    Mhhmm... forse non mi sono spiegato bene. Io voglio che la progress bar venga aggiornata ogni 10 o 100 o qualsiasi valore in millisecondi (come stabilito da Thread.sleep(n)). Ma non viene aggiornata. La progress bar appare trasparente (vedo lo sfondo blu del panel di JFrame che c'è sotto); quando il ciclo for contenente (tra l'altro; ovviamente mi serve di fare altro) la chiamata .sleep finisce, il ProgressMonitor viene visualizzato correttamente al 100% del progress.

    Qualcuno ha un'idea di cosa succede?

  5. #5
    Originariamente inviato da attilios
    Mhhmm... forse non mi sono spiegato bene. Io voglio che la progress bar venga aggiornata ogni 10 o 100 o qualsiasi valore in millisecondi (come stabilito da Thread.sleep(n)). Ma non viene aggiornata. La progress bar appare trasparente (vedo lo sfondo blu del panel di JFrame che c'è sotto); quando il ciclo for contenente (tra l'altro; ovviamente mi serve di fare altro) la chiamata .sleep finisce, il ProgressMonitor viene visualizzato correttamente al 100% del progress.

    Qualcuno ha un'idea di cosa succede?
    Allora pensa un attimo: se fai un ciclo di 100 ripetizioni e ogni volta fai uno sleep di 10 ms, la barra ci metterà un secondo ad arrivare al 100%, per questo t'ho consigliato di aumentare l'intervallo... può anche essere che si aggiorni talmente velocemente che neanche te ne accorgi... metti un valore piu' alto (anche 100 ms basterebbero) così vedi se davvero la progressbar ha problemi o aggiorna talmente velocemente che ti sembara che non funzioni.
    lolide
    Java Programmer

    Informati

  6. #6
    Ho provato con tutti i valori che mi dici, ma la barra rimane trasparente e mostra lo sfondo blu del JFrame sottostante.

  7. #7
    Originariamente inviato da attilios
    Ho provato con tutti i valori che mi dici, ma la barra rimane trasparente e mostra lo sfondo blu del JFrame sottostante.
    Ho scritto al volo uno snippet

    codice:
    public class Main extends JFrame {
    
        public Main() {
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            setTitle("Prova");
            setSize(new Dimension(500, 500));
            setPreferredSize(new Dimension(500, 500));
        }
    
        void execute () throws Exception {
            ProgressMonitor pm = new ProgressMonitor(this, "prova", "nota", 0, 100);
            for (int i = 0;i < 101;i++) {
                Thread.sleep(100);
                pm.setProgress(i);
            }
        }
    
        public static void main(String[] args) {
            try {
                Main f = new Main();
                f.execute();
                f.pack();
                f.setVisible(true);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
    E funziona perfettamente ... si apre una dialog, con una progressbar all'interno che avanza ogni 100 ms fino a riempirsi del tutto.
    Provando il mio codice, ti funziona?
    E nel tuo caso, il problema preciso qual'è?
    Magari posta uno screenshot.
    lolide
    Java Programmer

    Informati

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    E' un problema comune, di quando vuoi aggiornare componenti grafici swing da remoto..

    Devi forzare il paint manualmente..

    prova questo codice:

    codice:
    progress.setString(""+ progress.getValue() +"%"); Rectangle progressRect = progress.getBounds(); progressRect.x = 0; progressRect.y = 0;
    Ti prendi l'area dove è disegnata la progress bar e ci esegui il paint immediato..

    comunque ti consiglio di eseguire la funzione che setta la progress bar in un thread separato, e il dialog o frame dove è situata la progress bar rendila che implementi per esempio la PropertyChangeListener.. se fai comunicare il thread con la classe della progress bar in maniera adeguata riesci anche a non avere il lock sul pannello grafico che ti disabiliterebbe qualsiasi altra azione durante l'esecuzione della funzione che manovra la progress bar..


    Ciao ciao !

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    56
    progress.setString(""+ progress.getValue() +"%");
    Rectangle progressRect = progress.getBounds();
    progressRect.x = 0;
    progressRect.y = 0;
    progress.paintImmediately(progressRect);


    scusa ti avevo postato il codice male e mancava l'ultima riga..^

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.