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

    problemi con il timer..

    ciao a tutti, mi sono imbattuto nel seguente problema..
    ho un animazione da visualizzare per tot secondi per poi farla sparire..
    sto usando il timer di swing e chiamando all'interno del metodo azione(ActionEvent e)
    timer.wait(1000) seguito da timer.restart() ed un comando per rimuovere l'animazione non funziona,
    o meglio, il timer si ferma correttamente ma per sempre, non per l'intervallo da me specificato..
    ho gia provato con la soluzione thread.sleep e funziona piu o meno bene ma volevo sapere se era possibile
    effettuare una pausa del timer senza ricorrere all'uso dei thread.
    grazie

    Luca

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

    Re: problemi con il timer..

    Originariamente inviato da seimejote
    timer.wait(1000) seguito da timer.restart() ed un comando per rimuovere l'animazione non funziona
    Giusto per chiarezza: il metodo wait() non centra assolutamente nulla con il funzionamento del timer in sé. Centra invece con il sistema di wait/notify utilizzabile su tutti gli oggetti, a condizione di aver acquisito il lock sull'oggetto. E visto che sicuramente non hai ottenuto il lock, ti lancia una eccezione di IllegalMonitorStateException.

    Originariamente inviato da seimejote
    ho gia provato con la soluzione thread.sleep
    Cioè hai messo uno sleep() a seguito della invocazione di un metodo di un listener? Ad esempio nel actionPerformed() del timer?? Bisogna vedere uno sleep per quanto tempo .... potrebbe essere troppo. Così stai bloccando il EDT, event-dispatch-thread.


    Puoi fare altre cose:
    a) Quando vuoi sospendere il timer lo fermi davvero e fai partire un altro timer "one-shot" per un certo tempo. Quando darà l'evento farai ripartire l'altro timer.

    b) Quando vuoi sospendere il timer non blocchi veramente il timer ma imposti un flag in modo da non fare nulla (delle tue operazioni specifiche di animazione ecc...) a seguito dell'evento e imposti un contatore ad un certo valore che si decrementa ad ogni evento del timer. Arrivato a 0, rimetti il flag in modo che attivi le tue operazioni. Con una tale soluzione, il tempo di fermo è chiaramente un multiplo del tempo del timer!

    Ci sono sicuramente anche altre possibilità ... queste sono solo 2 che mi vengono in mente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    grazie per la risposta e grazie per le spiegazioni su wait()..
    cmq per le soluzioni da te proposte sulla seconda ok, mentre sulla prima cosa intendi con "timer one-shot"?
    una sorta di timer che fa un countdown per poi estinguersi?? com'e' possibile realizzarlo??
    grazie ancora

    Luca

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da seimejote
    cosa intendi con "timer one-shot"?
    Sempre un javax.swing.Timer a cui però imposti setRepeats(false), che lo fa diventare un "one shot" ovvero invia solo 1 action event e si stoppa da solo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    ok stavo provando ad implementare la seconda ma con scarsi risultati...
    allora nella classe dell'animazione ho inserito i metodi:

    public void pausa()
    {
    timer.stop();
    }


    public void riparti()
    {
    timer.restart();
    }
    mentre nella classe che contiene il costruttore di questa ho inserito:

    public void actionPerformed(ActionEvent e)
    {
    if (x == 150 || x == 600)
    {
    if (!pausa)
    {
    pausa = true;
    animazione.pausa();
    }

    }


    if (pausa)
    {
    int i = 0;
    i++;
    if (i >= 5)
    {
    animazione.riparti();
    i = 0;
    pausa = false;
    }

    }

    }
    l'animazione effettua correttamente la pausa ma non riparte e non capisco perche'..

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da seimejote
    l'animazione effettua correttamente la pausa ma non riparte e non capisco perche'..
    Beh, scusa ... fai lo stop() del timer. Ripeto: il timer non lo devi fermare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7

    Re: Re: problemi con il timer..

    si ma sto parlando di due classi con due timer separati.... nella classe dell'animazione c'e' un timer che viene fermato o fatto ripartire con i 2 metodi di prima, mentre nella seconda (quella che costruisce la prima) c'e' un altro timer (che non viene fermato) che esegue le operazioni di pausa\ripartenza del primo ogni tot cicli..
    non equivale a quanto hai detto prima??
    a) Quando vuoi sospendere il timer lo fermi davvero e fai partire un altro timer "one-shot" per un certo tempo. Quando darà l'evento farai ripartire l'altro timer.

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

    Re: Re: Re: problemi con il timer..

    Originariamente inviato da seimejote
    non equivale a quanto hai detto prima??
    Tu poco fa hai detto: "stavo provando ad implementare la seconda". Ma la seconda che ho detto io non è la a) che hai appena riportato ..... scusa eh.

    Comunque la prima soluzione, quella con il timer "one shot" si presta molto bene ad essere "incapsulata" in una comoda classe facilmente riutilizzabile.

    codice:
    public class SuspendableTimer
    {
        private int runDelay;
        private Timer runTimer;
    
        public SuspendableTimer (int runDelay, ActionListener listener)
        {
            this.runDelay = runDelay;
    
            runTimer = new Timer (runDelay, listener);
        }
    
        public void start ()
        {
            runTimer.start ();
        }
    
        public void stop ()
        {
            runTimer.stop ();
        }
    
        public void suspend (int waitDelay)
        {
            runTimer.stop ();
    
            Timer t = new Timer (waitDelay - runDelay, new ActionListener ()
            {
                public void actionPerformed (ActionEvent e)
                {
                    runTimer.start ();
                }
            });
    
            t.setRepeats (false);
            t.start ();
        }
    }
    L'ho scritta "di getto" ... non l'ho provata ma dovrebbe essere ok.
    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.