2009-06-17 22 views
9
ActionListener taskPerformer = new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     //...Perform a task... 

     logger.finest("Reading SMTP Info."); 
    } 
}; 
Timer timer = new Timer(100 ,taskPerformer); 
timer.setRepeats(false); 
timer.start(); 

In base alla documentazione questo timer dovrebbe fuoco una volta ma non è mai fuochi. Ne ho bisogno per sparare una volta.Java Swing Timer

risposta

17

Questo semplice programma funziona per me:

import java.awt.event.*; 
import javax.swing.*; 

public class Test { 
    public static void main(String [] args) throws Exception{ 
     ActionListener taskPerformer = new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
       //...Perform a task... 

       System.out.println("Reading SMTP Info."); 
      } 
     }; 
     Timer timer = new Timer(100 ,taskPerformer); 
     timer.setRepeats(false); 
     timer.start(); 

     Thread.sleep(5000); 
    } 
} 
+0

vero . Non ho mai provato il timer senza una GUI. – akarnokd

+0

Grazie, ho trovato che il mio logger dei problemi è inizializzato dopo l'esecuzione di questo codice, ecco perché non ho mai visto i miei messaggi di test. cambio del logger con println aiutato. –

+0

IIRC, non dovresti usare javax.swing.Timer fuori dall'EDT. –

1

vostro compito probabilmente ha solo bisogno di rapporto risultati sul filo evento (EDT), ma fare il lavoro effettivo in un thread in background ad un certo tasso periodico.

ScheduledExecutorService è ESATTAMENTE quello che vuoi. Basta ricordarsi di aggiornare lo stato della vostra interfaccia utente sul EDT via SwingUtility.invokeLater (...)

1

Sto indovinando dalla dichiarazione di registro che si sta facendo una sorta di operazione SMTP. Penso di avere ragione nel dire che lo java.swing.Timer è inteso per le operazioni temporizzate relative all'interfaccia utente, quindi perché ha bisogno di EDT in esecuzione. Per operazioni più generali dovresti usare java.util.Timer.

Questo articolo è legato dai JavaDocs -

2

Questo programma funziona bene ...

setRepeats(boolean flag) funzione utilizzata per impostare chiamare il function(actionPerformed) ripetutamente o una sola volta se

  1. timer.setRepeats(false) == timer chiama il metodo actionperformed per una sola volta
  2. timer.setRepeats(true) == timer chiama il metodo actionPerformed più volte in base al tempo specificato

swing Timer lavoro

  1. fare l'operazione una sola volta
  2. fare il compito ripetuto tempo

passaggi per creare timer altalena:

  1. creare l'ActionListener
  2. creare il costruttore temporizzatore poi passare il tempo e ActionListener in quel
  3. implementare la funzione actionPerformed() in cui fare il vostro compito
  4. uso timer.start() per avviare l'attività tra il tempo specificato nel costruttore timer, utilizzare timer.stop() per fermare il compito

Esempio:

ActionListener al=new ActionListener(
public void actionPerformed(ActionEvent ae) 
{ 
//do your task 
if(work done) 
    timer.stop();//stop the task after do the work 
} 
); 
Timer timer=new Timer(1000,al);//create the timer which calls the actionperformed method for every 1000 millisecond(1 second=1000 millisecond) 
timer.start();//start the task