PDA

View Full Version : JAVA... JProgressBar Problema


Slashjr
01-04-2006, 10:51
Ho un problema con l'aggiornamento del componente JProgressBar, ecco il codice:

...
int con = 0;
int cont = 1;
progressBar.setValue(con);
while(con <= 10){
cont = 0;
while(cont <= 500000000){
cont++;
}
progressBar.setValue(con);
con++;
System.out.println("Numero: "+con);
System.out.println("Bar: "+progressBar.getValue());
}
System.out.println("Fine");
...

Non funziona come dovrebbe l'aggiornamento della barra JProgressBar, ora vi spiego meglio:
La barra è stata suddivisa in 10 parti ed in base al parametro che gli viene passato con la varibile "con" si dovrebbe colorare, ma non è così:

con = 0 La barra non è colorata, quindi OK
con = 1 La barra dovrebbe avere la prima parte colorata ma niente
con = 2 La barra dovrebbe avere la prima parte ancora più colorata ma niente
con = ...
Con = 10 La Barra è tutta colorata quindi OK

Ho messo:
System.out.println("Numero: "+con);
System.out.println("Bar: "+progressBar.getValue());
Per vedere il valore di "Bar: "+progressBar.getValue() ed è Ok, ma la barra durante l'esecuzione sembra bloccata, si aggiorna solo alla fine.

Come posso far aggiornare la barra in maniera corretta, cioè ad ogni aggiornamento del parametro "con"? :muro: :muro: :muro:

GRAZIE AMICI

vegeta83ssj
01-04-2006, 11:11
Premetto che non ho mai utilizzato questo componente ma puoi dire come l'hai inizializzato ?
Perchè leggendo la documentazione dovrsti impostare il valore min e max della barra all'atto della creazione!
Cmq qui: http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html
c'è il tutorial della Sun sulle progress bar!

Ciauz

Slashjr
02-04-2006, 08:14
Premetto che non ho mai utilizzato questo componente ma puoi dire come l'hai inizializzato ?
Perchè leggendo la documentazione dovrsti impostare il valore min e max della barra all'atto della creazione!
Cmq qui: http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html
c'è il tutorial della Sun sulle progress bar!

Ciauz

Intanto grazie per avermi risposto!!!

Alllora il componente è correttamente visualizzato nella gui, il problema è il suo aggiornamento. Cmq:

Prima è stato dichiarato nella classe che estende il JFrame così:

private JPanel benchPanel;
private JLabel vediamoLabel;
private JProgressBar progressBar;
private JButton startButton;
private JButton exitBenchButton;

Poi è stato costruito:

benchPanel = new JPanel();
vediamoLabel = new JLabel("Avvia");
progressBar = new JProgressBar(0,10);
startButton = new JButton("START", new ImageIcon(cl.getResource("images/gen.gif")));;
exitBenchButton = new JButton("EXIT", new ImageIcon(cl.getResource("images/chiudi.gif")));
benchPanel.add(vediamoLabel);
benchPanel.add(progressBar);
benchPanel.add(startButton);
benchPanel.add(exitBenchButton);
benchPanel.setVisible(false);
....
contpane.add(benchPanel);

E poi il codice che avevo postato all'inizio è messo nel Listener

private class startButtonListener implements ActionListener {
public void actionPerformed (ActionEvent er) {

Tutti gli altri componenti swing funzioname benissimo... è solo questa cavolo di Barra che non funziona come dovrebbe!!! :help:

sottovento
03-04-2006, 07:07
Ciao,
il problema sembrerebbe che, se metti quel ciclo for all'interno della actionPerformed, non dai tempo alla JVM di rinfrescare lo stato della tua progress bar. Quando fai un setValue(), la barra NON viene rinfrescata (cioe' ridisegnata), ma viene messo in coda un comando di rinfresco, il quale verra' eseguito quando il controllo passa ancora alla Virtual Machine.
Nel tuo caso, il controllo ci passa quando hai finito il ciclo, per cui vedi la barra passare da vuota a completamente piena.

High Flying
Sottovento

Slashjr
03-04-2006, 08:21
Ciao,
il problema sembrerebbe che, se metti quel ciclo for all'interno della actionPerformed, non dai tempo alla JVM di rinfrescare lo stato della tua progress bar. Quando fai un setValue(), la barra NON viene rinfrescata (cioe' ridisegnata), ma viene messo in coda un comando di rinfresco, il quale verra' eseguito quando il controllo passa ancora alla Virtual Machine.
Nel tuo caso, il controllo ci passa quando hai finito il ciclo, per cui vedi la barra passare da vuota a completamente piena.

High Flying
Sottovento

Analisi PERFETTA!!! ;) ;) ;)
... ma c'è una soluzione a questo? :muro:

sottovento
03-04-2006, 09:03
Analisi PERFETTA!!! ;) ;) ;)
... ma c'è una soluzione a questo? :muro:
Beh si,
immagino che il tuo programma fosse di prova (hai un ciclo che continua ad incrementarsi all'interno di una actionPerformed...).

Cmq non devi fare quelle operazioni in quella sede! Nella actionPerformed devi semplicemente ATTIVARE qualcun altro. Per esempio, potresti lanciare un thread che fa le operazioni che ti interessano, oppure fare una notify() ad un thread gia' in esecuzione.
Non e' una cosa difficile, e le modifiche richieste, se ci pensi, non sono eccessive.
Ogni volta che sei un una actionPerformed (non solo quella), la GUI non e' responsiva...


High Flying
Sottovento

Slashjr
03-04-2006, 18:56
Beh si,
immagino che il tuo programma fosse di prova (hai un ciclo che continua ad incrementarsi all'interno di una actionPerformed...).

Cmq non devi fare quelle operazioni in quella sede! Nella actionPerformed devi semplicemente ATTIVARE qualcun altro. Per esempio, potresti lanciare un thread che fa le operazioni che ti interessano, oppure fare una notify() ad un thread gia' in esecuzione.
Non e' una cosa difficile, e le modifiche richieste, se ci pensi, non sono eccessive.
Ogni volta che sei un una actionPerformed (non solo quella), la GUI non e' responsiva...


High Flying
Sottovento


Giusto... proverò mettendo le cose in thread differenti, poi se la cosa non funziona potrei anche usare un sleep() sui thread così darei alla GUI il tempo per aggiornarsi.

sottovento
04-04-2006, 06:26
Giusto... proverò mettendo le cose in thread differenti, poi se la cosa non funziona potrei anche usare un sleep() sui thread così darei alla GUI il tempo per aggiornarsi.
Non preoccuparti, se fai le operazioni in thread differenti e' tutto ok.
La sleep, invece, potrebbe non risolverti le cose (resti comunque fermo nella actionPerformed(), per cui la GUI non puo' rinfrescare).

High Flying
Sottovento