|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
[JAVA]Problemi basilari nelle progress bar: un aiuto per favore?
Salve a tutti,
mi è sempre rimasto oscuro il mondo delle progress bar perché dei dubbi mi attanagliano da sempre e non riesco a venirne fuori, anche guardando il Java Tutorial. Quello che vorrei fare è mettere una progress bar (magari anche in popup) durante il caricamento della mia applicazione (un classico). Nella mia applicazione parte un form all'inizio e dopo un click su un JButton viene avviata la vera interfaccia grafica (che richiede un po' di tempo per esser caricata in memoria). Quì vorrei mettere la progress bar. I problemi che ho sono: 1) Come faccio a sapere a priori quanto ci metterà a caricare, se devo impostare un avanzamento di una percentuale? 2) Come faccio a dirgli che deve partire dopo che ho premuto sul JButton e deve fermarsi quando l'applicazione è pronta? 3) Un'altro problema è che il JButton rimane premuto fino a che non ha finito di caricare in memoria tutto e la vera interfaccia non è comparsa. Pensavo all'utilizzo di un Thread, ma è questo il caso? |
![]() |
![]() |
![]() |
#2 | |||
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Quote:
In passato ho considerato di suddividere il lavoro di costruzione dell'interfaccia in vari task (ad esempio 10, creazione finestra principale, creazione dialog1, eccetera) e al completamento di ogni task far avanzare la pbar di 1/10 (sempre ad esempio). Non ti serve farlo in un thread separato, anzi e' meglio se lo fai sull'EDT. Quote:
Quote:
altrimenti chiudi la finestra con il pulsante (non ha piu' senso)
__________________
|Java Base| |
|||
![]() |
![]() |
![]() |
#3 | |||
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Quote:
Quote:
Quote:
Grazie per il supporto. |
|||
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Per il discorso del bottone che "rimane premuto" (in sostanza il repaint schedulato non viene eseguito in tempo, cioè prima di tutto l'ambaradam di codice che apre l'interfaccia principale e che, come il repaint del bottone, sarà eseguito nel contesto dell'EDT [se l'interfaccia è in AWT/Swing, come credo]) puoi risolvere in questo modo, se le premesse son quelle che seguono:
- il processo che fa partire l'ambaradam di cui sopra è invocato nell'actionPerformed() del tuo Button. Prova questo, nell'actionPerformed del button: Codice:
public void actionPerformed(ActionEvent e) { Runnable buildInterface = new Runnable() { public void run() { // ... // ... codice di costruzione dell'interfaccia principale // ... } }; SwingUtilities.invokeLater(buildInterface); } Questo se ho capito bene la faccenda, il che non è scontato, eheh
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 13-11-2008 alle 13:50. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Perfetto! Grazie banryu79!
Ora è una scheggia.. Non resta che mettere una JProgressBar o un cursore di attesa nel momento che intercorre fra il dispose della JDialog di login e la comparsa della GUI principale. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
De nada
![]() Per il futuro, se hai problemi simili considera che questo know how lo reperisci facilmente nel sito java.sun (ovviamente in inglese).
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Stavo pensando ad una cosa: è possibile lanciare una JProgress bar in indeterminate mode, subito prima che parta l'inizializzazione di tutta la GUI, e disattivarla non appena inizializzata?
Che dite, può funzionare come idea? Perché in caso la metterei direttamente nella mia funzione initialize() della GUI. Ultima modifica di fbcyborg : 13-11-2008 alle 16:57. |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Esistono due tipi di JProgressBar: quelle con la percentuale
![]() ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Mi pare proprio che la seconda faccia al caso tuo.
La fai partire non appena lanci il processo di costruzione della GUI, e la spegni al completamento di tale processo che quando ha finito le fa un fischio.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Come ha detto lovaz puoi suddividere i vari momenti del caricamento in fasi ed incrementare la barra di progresso in base alla fase in cui il caricamento si trova.
Ovviamente per funzionare la barra la fase di caricamento e di login deve essere eseguita in un thread diverso dall'event dispatching thread . Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
E' possibile mettere una scritta lampeggiante nella progress bar del tipo "Caricamento ..." ?
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Beh, JProgressBar ha un metodo setString() e se non sbaglio puoi anche impostare stili di barre personalizzati, quindi dovrebbe essere abbastanza costumizzabile, però io personalmente non l'ho mai fatto, quindi più di così non so
Ciao
__________________
GPU Compiler Engineer |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
il setString() l'avevo provato ma non funziona. Per caso bisogna metterlo in un ciclo e farglielo fare ad ogni iterazione?
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
Ciao
__________________
GPU Compiler Engineer |
|
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Grazie! Ha funzionato!!!
![]() |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Ho usato il sistema proposto da banryu79, ovvero il seguente codice per risolvere il problema del tasto OK che rimaneva premuto:
Codice:
public void actionPerformed(ActionEvent e) { Runnable buildInterface = new Runnable() { public void run() { // ... // ... codice di costruzione dell'interfaccia principale // ... } }; SwingUtilities.invokeLater(buildInterface); } Ora vorrei riuscire a far visualizzare una JProgressBar indeterminata in uno dei due seguenti modi, e deve essere visualizzata nel tempo che intercorre fra la pressione del tasto OK e la comparsa della GUI principale. Ho fatto diverse prove ma non sono ancora riuscito a trovare il modo giusto. 1) JProgressBar che viene visualizzata come popup, dopo che si è premuto il tasto OK e che quindi il form di login è scomparso 2) JProgressBar che è incorporata nel form di login e che viene visualizzata solo quando si preme OK (quindi sempre in fase di caricamento). Quì però il problema è che appena si preme OK, faccio una dispose() del JDialog (ok, potrei toglierlo, e farlo fare alla GUI principale alla fine della sua inizializzazione. Che consigli potete darmi? |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Usa un altro Runnable, che chiamiamo "showProgression", così lo puoi accodare nell'EDT prima di "buildInterface".
Naturalmente devi passare a "buildInterface" una reference che punti al componente grafico da lanciare in "showProgression" in modo da poter fermare la ProgressBar e chiudere la relativa finestra appena la GUI è inizializzata (cioè al termine del processo definito in "buildInterface") A questo punto ti potresti definire i due Runnable come classi al di fuori del metodo actionPerformed, che si limiterà a schedulare correttamente i due "task": Codice:
public void actionPerformed(ActionEvent e) { // costruisce "showProgression" e lo accoda nell'EDT ShowProgression progressionFrame = new ShowProgression(); SwingUtilities.invokeLater(progressionFrame); // costruisce "buildInterface", passa riferimento al "showProgression" // da chiudere al completamento e lo accoda nell'EDT SwingUtilities.invokeLater(new BuildInterface(progressionFrame)); } - ShowProgression è una classe che estende JFrame o JDialog (per la versione popup della ProgressBar) e implementa Runnable (così è accodabile come thread da eseguire nell'EDT) - BuildInterface è una classe che semplicemente estende Thread oppure implementa Runnable.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2004
Città: ROMA
Messaggi: 2055
|
Ok, prima di provare ho una domanda ancora: le due classi che implementano runnable, devono implementare il metodo run(). All'interno però non ci scrivo nulla giusto?
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Eh no, all'interno dei due metodi run() devi proprio metterci il codice che deve essere eseguito.
Riferendomi al problema di lanciare la costruzione dell'interfacica, ad esempio: Codice:
class BuildInterface implements Runnable { private ShowProgression progression; public BuildInterface(ShowProgression sp) { progression = sp; //... } public void run() { // ... // ... codice di costruzione dell'interfaccia principale // ... "chiudere" progression alla fine } }; Codice:
class ShowProgression extends JFrame implements Runnable { // membri di ShowProgression... public ShowProgression() { //... costruttore, costruisci l'interfaccia via codice //... operazioni classiche, istanziazione componenti, // setting dei LayoutManager, creazione e setting della JProgressBar //... ecc... } public void run() { // ... // ...codice di realizzazione del JFrame e dei suoi componenti (setVisible) // ...attivazione della progress bar // ... } }
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:33.