Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    127

    utilizzare una progress bar

    ciao,

    allora la mia Gui al click di un pulsante esegue un metodo di una classe che impiega un pò di tempo per terminare.

    durante tutto questo lasso di tempo il pulsante resta "cliccato" quindi tutta l'interfaccia resta bloccata.

    io vorrei che l'utente visualizzasse una sorta di barra di progresso,
    ho dato un occhiata a JProgressBar (http://java.sun.com/docs/books/tutor...ress.html#bars)

    ma nn ho capito come si usa TASK ....

    Un altra cosa mi chiedevo, se anche riuscissi a mettere in quel frame un indicatore di avanzamento, questo resterebbe bloccato come il pulsante cliccato ? A questo punto potrei lanciare un thread che mi gestisce un altro frame con l'avanzamento, e chiuderlo quando il famoso metodo è terminato...

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

    Re: utilizzare una progress bar

    Originariamente inviato da tulkas85
    durante tutto questo lasso di tempo il pulsante resta "cliccato" quindi tutta l'interfaccia resta bloccata.
    Sicuramente stai eseguendo il tuo "lavoro" lungo nel contesto del EDT e questo causa il "congelamento" della interfaccia utente. Ed è un grosso errore. Prima di andare avanti, chiarisciti queste questioni sul threading in Swing.

    Originariamente inviato da tulkas85
    io vorrei che l'utente visualizzasse una sorta di barra di progresso,
    ho dato un occhiata a JProgressBar (http://java.sun.com/docs/books/tutor...ress.html#bars)

    ma nn ho capito come si usa TASK ....

    Un altra cosa mi chiedevo, se anche riuscissi a mettere in quel frame un indicatore di avanzamento, questo resterebbe bloccato come il pulsante cliccato ? A questo punto potrei lanciare un thread che mi gestisce un altro frame con l'avanzamento, e chiuderlo quando il famoso metodo è terminato...
    Il tuo "lavoro" lungo devi farlo eseguire nel contesto di un altro thread, che non sia il EDT ovviamente. Se vuoi creare e avviare direttamente un java.lang.Thread oppure vuoi sfruttare un SwingWorker .... beh, dipende da te. SwingWorker è "di serie" da Java 6 ma è possibile scaricare il sorgente (dal tutorial Sun) anche per Java 5 e comunque in effetti facilita certi compiti relativi all'aggiornamento della interfaccia utente.

    Il concetto è che in quel thread separato fai ovviamente il tuo "lavoro" e dovresti anche aggiornare lo stato della progress bar. Ma non devi farlo direttamente. Salvo pochi casi documentati, l'accesso a qualunque componente della interfaccia utente va fatto solo ed esclusivamente nel contesto del EDT. Quindi nel tuo thread separato non puoi fare direttamente progressBar.setValue(....). Se usi direttamente un Thread che lanci tu, devi usare il solito SwingUtilities.invokeLater(), se usi SwingWorker, per questo ti aiuta un pochino e in vari modi (vedi documentazione e tutorial).
    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
    Registrato dal
    Jan 2006
    Messaggi
    127
    allora, seguendo la strada di utilizzare java.lang.Thread , magari creo una classe che estende thread o implementa Runnable e nel metodo Run metto la chiamata a quel mio metodo statico dispendioso...

    ora dall'interfaccia al click sul pulsante lancio il Thread..... poi ?

    come utilizzo la JProgressBar ?

    Dal thread io non posso sapere quanto tempo impiegherà il metodo a terminare il suo lavoro. Per questo cercavo una cosa per la quale io potessi dare una sorta di start e stop rispettivamente prima e dopo la chiamata del metodo...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tulkas85
    ora dall'interfaccia al click sul pulsante lancio il Thread..... poi ?

    come utilizzo la JProgressBar ?

    Dal thread io non posso sapere quanto tempo impiegherà il metodo a terminare il suo lavoro. Per questo cercavo una cosa per la quale io potessi dare una sorta di start e stop rispettivamente prima e dopo la chiamata del metodo...
    Vediamo la cosa in generale e sopratutto la situazione "tipica":

    1) A seguito di un "evento" devi avviare un "lavoro" lungo. L'evento tipicamente è un click su un pulsante o voce di menù ... ma potrebbe essere qualunque altra cosa (es. selezione in un combo box).

    2) Nel contesto di gestione dell'evento (nel EDT) si dovrebbe prima di tutto disabilitare il/i componente/i che hanno generato l'evento (in modo che l'utente non faccia casini e non possa lanciare più volte il "lavoro"). In alcuni casi può aver senso che l'utente possa lanciare più volte il lavoro ... ma dipende da che cosa è e fa questo "lavoro", ovviamente.

    3) Sempre nel EDT si crea e avvia un thread separato, ad esempio con Thread. Una volta avviato il thread separato, la gestione dell'evento può terminare qui e il controllo ritorna al framework.

    4) Il thread separato esegue il lavoro e di tanto in tanto aggiorna la interfaccia utente. Il progresso può essere visualizzato in moltissimi modi, es. con un JProgressBar, con un banale JLabel che mostra semplicemente una percentuale o con un altro componente ... non ha importanza. Invece è importantissimo che l'aggiornamento di questo componente sia fatto nel contesto del EDT!! Quindi si usa invokeLater() per far eseguire un piccolo Runnable (nel EDT) che aggiorna il componente.

    5) Alla fine del lavoro, sempre nel thread separato, si dovrebbe riattivare il/i componente/i che erano stati disabilitati. Anche qui stessa regola: va fatto nel contesto del EDT.

    SwingWorker rispetto all'uso diretto di un Thread, ha il vantaggio che semplifica la gestione dell'aggiornamento della interfaccia utente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    127
    allora per il punto 2) in effetti sarebbe preferibile che una volta lanciato l'evento , altri eventi simili vengano ignorati, cmq questa è una cosa facile da realizzare.

    quindi io ho la mia interfaccia, che implementa Runnable e in run() metto la gestione di una label in un JPanel che ogni mezzo secondo chiama setVisible(true ) e poi false , l'obbiettivo sarebbe simulare una sorta di lampeggiamento.

    Quando viene cliccato il pulsante, l'evento fa partire un thread distaccato che fa il lavoro pesante, prima di fare questo lavoro invoco SwingUtilities.invokeLater(MiaInterfaccia.this); (la classe del thread distaccato l'ho messa interna alla classe dell'interfaccia MiaInterfaccia)

    SwingUtilities.invokeLater fa in modo che venga lanciato il run dell'interfaccia, ma il JPanel non si comporta come avevo pensato, resta "fermo" ........

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tulkas85
    quindi io ho la mia interfaccia, che implementa Runnable e in run() metto la gestione di una label in un JPanel che ogni mezzo secondo chiama setVisible(true ) e poi false , l'obbiettivo sarebbe simulare una sorta di lampeggiamento.
    Allora basterebbe un javax.swing.Timer. Un esempio (proprio di JLabel "lampeggiante") l'avevo giusto postato qui.

    Originariamente inviato da tulkas85
    Quando viene cliccato il pulsante, l'evento fa partire un thread distaccato che fa il lavoro pesante, prima di fare questo lavoro invoco SwingUtilities.invokeLater(MiaInterfaccia.this);
    A che scopo???
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    127
    vabbè alla fine ci sono riuscito con il tuo timer,

    prima di lanciare il thread che gestisce il comito oneroso faccio timer.start()

    nel thread quando finisce il compito lancio timer.stop()

    grazie x l'aiuto !

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.