Reputation: 49329
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.
Upvotes: 17
Views: 86125
Reputation: 71
This Program will work fine...
setRepeats(boolean flag)
function used to set call the function(actionPerformed)
repeatedly or only one time if
timer.setRepeats(false) == timer
calls the actionperformed method for only one timetimer.setRepeats(true) == timer
calls the actionPerformed method repeatedly based on specified timeSwing Timer Work
steps to create swing timer:
actionPerformed()
function in which do your tasktimer.start()
for start the task between the time specified in timer constructor, use timer.stop()
for stop the taskExample:
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
Upvotes: 6
Reputation: 104168
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);
}
}
Upvotes: 22
Reputation: 34301
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/
Upvotes: 1
Reputation: 30004
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(...)
Upvotes: 1