2009-06-17 14 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(); 

Zgodnie z dokumentacją ten timer powinien wystrzelić jeden raz, ale nigdy nie wystrzeli. Potrzebuję go raz.Java Swing Timer

Odpowiedz

17

Ten prosty program działa na mnie:

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

prawda . Nigdy nie próbowałem timera bez GUI. – akarnokd

+0

Dzięki, znalazłem mój rejestrator problemów został zainicjowany po uruchomieniu tego kodu, dlatego nigdy nie widziałem wiadomości testowych. zmiana logger z println pomógł. –

+0

IIRC, nie powinieneś używać javax.swing.Timer z EDT. –

1

Twoim zadaniem prawdopodobnie potrzebuje tylko raportu wyników na wątku zdarzeń (EDT), ale robić rzeczywistej pracy w wątku tła w pewnym okresową stopę.

ScheduledExecutorService to DOKŁADNIE czego chcesz. Po prostu pamiętaj, aby zaktualizować stan swojego interfejsu użytkownika na EDT za pośrednictwem SwingUtility.invokeLater (...)

1

Zgaduję na podstawie logu, że wykonujesz jakąś operację SMTP. Myślę, że mam rację mówiąc, że java.swing.Timer jest przeznaczony do operacji czasowych związanych z interfejsem użytkownika, stąd dlaczego potrzebuje i działa EDT. W przypadku bardziej ogólnych operacji powinieneś użyć java.util.Timer.

Ten artykuł jest związany z Javadocs -

2

Program ten będzie działać dobrze ...

setRepeats(boolean flag) funkcja służy do ustawiania wywołać function(actionPerformed) wielokrotnie lub tylko jeden raz, jeśli

  1. timer.setRepeats(false) == timer wywołuje metodę actionperformed tylko jeden raz wywołując metodę actionPerformed wielokrotnie na podstawie określonego czasu

Swing Zegar Pracuj

  1. wykonać zadanie jeden raz
  2. zrobić czas zadania powtarzane

kroki, aby stworzyć czasomierz Swing

  1. stworzyć ActionListener
  2. utworzyć konstruktor zegara następnie przekazać czasu i ActionListener w tym
  3. realizacji funkcji actionPerformed() w którym zrobić swoje zadanie
  4. użytkowania timer.start() do uruchomienia zadania między czasie określonym w konstruktorze timera, użyj timer.stop() do zatrzymania zadania

Przykład:

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