Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    Progress bar con ellips

    (Rischia di essere un tiro a vuoto, ma ci provo lo stesso)

    Stò lavorando con le firme digitali, usando il pacchetto ellips della Actalis. Ora, siccome il procedimento è lento, pensavo di usare una progressbar per far intuire all'utente che il programma funziona e non si è piantato...

    il problema è che non so come reperire lo stato di avanzamento per fare una progressbar credibile.

    Qualcuno ha lavorato con quel pacchetto e sa come fare?

    In alternativa, c'è un modo per fare quella pseudobarra di scorrimento che va avanti e indietro che usa spesso anche mozilla firefox quando scarica un file di cui non conosce la dimensione a priori?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Progress bar con ellips

    Originariamente inviato da Reiuky
    Qualcuno ha lavorato con quel pacchetto e sa come fare?
    Io personalmente no. La documentazione javadoc è disponibile online? Se c'è posso provare a dargli una occhiata (ammesso che non sia troppo complessa).

    Originariamente inviato da Reiuky
    In alternativa, c'è un modo per fare quella pseudobarra di scorrimento che va avanti e indietro che usa spesso anche mozilla firefox quando scarica un file di cui non conosce la dimensione a priori?
    JProgressBar può essere impostato per stare in uno stato chiamato "indeterminate" (vedi setIndeterminate()). In tale stato mostra una animazione continua che indica una operazione di durata non determinata.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    Re: Re: Progress bar con ellips

    Originariamente inviato da andbin
    Io personalmente no. La documentazione javadoc è disponibile online? Se c'è posso provare a dargli una occhiata (ammesso che non sia troppo complessa).
    On-line no. E non so se posso passarti quella che ho io (non ho la più pallida idea di come stiamo messi qua in ditta con i permessi, se il pacchetto è a uso esclusivo o se la documentazione è free...

    JProgressBar può essere impostato per stare in uno stato chiamato "indeterminate" (vedi setIndeterminate()). In tale stato mostra una animazione continua che indica una operazione di durata non determinata.
    Ora sperimento... almeno è meglio di niente ^__^

  4. #4
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Duuuunque....

    Non capisco bene come funziona la JProgressBar..

    O, meglio, ho provato a fare così

    codice:
    public void actionPerformed(ActionEvent ev )
    	{
    		
    		progressBar.setVisible(true);
    		startButton.setEnabled(false);
    
    		prova();
    		
    		progressBar.setVisible(false);
    		startButton.setEnabled(true);
    
    	}
    con 'prova' che si limita a stampare sullo schermo i numeri da 1 a cento uno ogni 10 millisecondi.

    Nella mia testa il codice dovrebbe prima settare come visible la progressbar, poi far partire il metodo prova e infine far sparire di nuovo la progressbar.

    Invece, la progressbar non si vede mai.

    Dove sbaglio?

    Edit: Ho fatto un tentativo commentando la riga progressBar.setVisible(false);
    Adesso la progressBar mi viene visualizzata, ma solo DOPO che prova ha finito a lavorare. Tutto ciò è molto strano.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Reiuky
    Non capisco bene come funziona la JProgressBar..
    Non è un problema del JProgressBar ... è un problema legato a questioni sui thread.

    Originariamente inviato da Reiuky
    codice:
    public void actionPerformed(ActionEvent ev )
    	{
    		
    		progressBar.setVisible(true);
    		startButton.setEnabled(false);
    
    		prova();
    		
    		progressBar.setVisible(false);
    		startButton.setEnabled(true);
    
    	}
    con 'prova' che si limita a stampare sullo schermo i numeri da 1 a cento uno ogni 10 millisecondi.
    Appunto ... la questione è tutta qui.
    Swing non è thread-safe. Tutta la gestione della interfaccia utente (disegno dei componenti, dispacciamento degli eventi, ecc...) è fatta in un unico thread chiamato EDT (event dispatch thread). E l'accesso ai componenti va fatto solo ed esclusivamente nel contesto di questo thread (salvo alcuni casi particolari, ben documentati, oltretutto).

    Quando un metodo di un listener viene invocato, si è nel contesto del EDT. Ma non devi mai occupare più di tanto tempo il EDT, altrimenti la tua interfaccia si "congela". Se il controllo non ritorna al framework, nulla può essere disegnato, aggiornato a video.

    Sono questioni molto essenziali, ne ho già parlato tante volte sul forum.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Originariamente inviato da andbin
    Non è un problema del JProgressBar ... è un problema legato al thread.

    Appunto ... la questione è tutta qui.
    Swing non è thread-safe. Tutta la gestione della interfaccia utente (disegno dei componenti, dispacciamento degli eventi, ecc...) è fatta in un unico thread chiamato EDT (event dispatch thread). E l'accesso ai componenti va fatto solo ed esclusivamente nel contesto di questo thread (salvo alcuni casi particolari, ben documentati, oltretutto).

    Quando un metodo di un listener viene invocato, si è nel contesto del EDT. Ma non devi mai occupare più di tanto tempo il EDT, altrimenti la tua interfaccia si "congela". Se il controllo non ritorna al framework, nulla può essere disegnato, aggiornato a video.

    Sono questioni molto essenziali, ne ho già parlato tante volte sul forum.
    Quindi, se ho capito bene, l'interfaccia viene congelata ogni volta che chiamo un metodo, e non viene ripristinata finché il metodo non finisce l'elaborazione...

    Provo ad aggirare il problema facendo in modo che prova diventi un thread, e che sia lei a settare visibile e invisibile la JProgressBar... Va bene come ragionamento o è una forzatura inutile?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Reiuky
    Quindi, se ho capito bene, l'interfaccia viene congelata ogni volta che chiamo un metodo, e non viene ripristinata finché il metodo non finisce l'elaborazione...
    No. L'aggiornamento della interfaccia utente avviene sempre nel contesto del EDT. Ma se sei tu che stai impegnando il EDT ... beh, è chiaro che tale aggiornamento non puoi avvenire. Puoi fare tutti i setXXX che vuoi sui componenti ... ma se tieni bloccato il EDT, swing non può né disegnare né notificare altri listener.

    Originariamente inviato da Reiuky
    Provo ad aggirare il problema facendo in modo che prova diventi un thread, e che sia lei a settare visibile e invisibile la JProgressBar... Va bene come ragionamento o è una forzatura inutile?
    In questi casi, eseguire un lavoro X molto lungo in un thread separato è l'unica soluzione.

    E qui però torniamo al fatto che swing non è thread-safe (salvo eccezioni, come ho detto). Quindi se stai eseguendo qualcosa in un thread separato, non dovresti accedere da lì direttamente alla interfaccia utente. Non ho detto che tecnicamente non puoi .... non dovresti. Se lo fai .... beh, con tempistiche molto sfavorevoli, potrebbero saltare fuori casini.

    Se vuoi agire sulla interfaccia utente, devi farlo nel contesto del EDT. Se sei in un altro thread, allora dovresti usare i metodi invokeLater/invokeAndWait di SwingUtilities.

    Per approfondimenti, vedi i link che avevo indicato qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.