Java Swing Timer

Solution 1:

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

Solution 2:

This Program will work fine...

setRepeats(boolean flag) function used to set call the function(actionPerformed) repeatedly or only one time if

  1. timer.setRepeats(false) == timer calls the actionperformed method for only one time
  2. timer.setRepeats(true) == timer calls the actionPerformed method repeatedly based on specified time

Swing Timer Work

  1. do the task one time
  2. do the task repeated time

steps to create swing timer:

  1. create the actionlistener
  2. create the timer constructor then pass time and actionlistener in that
  3. implement the actionPerformed() function in which do your task
  4. use timer.start() for start the task between the time specified in timer constructor, use timer.stop() for stop the task

Example:

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

Solution 3:

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

Solution 4:

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/