tags:

views:

1118

answers:

3

    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();

According to the documentation this timer should fire once but it never fires. I need it to fire once.

+3  A: 

This simple program works for 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);
    }
}
kgiannakakis
True. I never tried Timer without a GUI.
kd304
Thanks, i found my problem logger is initialized after this code is run that's why i never saw my test messages. switching logger with println helped.
Hamza Yerlikaya
IIRC, you shouldn't use javax.swing.Timer off the EDT.
Tom Hawtin - tackline
A: 

Your task likely only needs to report results on the event thread (EDT) but do the actual work in a background thread at some periodic rate.

ScheduledExecutorService is EXACTLY what you want. Just remember to update the state of your UI on the EDT via SwingUtility.invokeLater(...)

basszero
A: 

I'm guessing from the log statement that you're doing some sort of SMTP operation. I think I'm right in saying the java.swing.Timer is intended for UI related timed operations, hence why it needs and EDT running. For more general operations you should use java.util.Timer.

This article is linked from the JavaDocs - http://java.sun.com/products/jfc/tsc/articles/timer/

Nick Holt