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
-
timer.setRepeats(false) == timer
calls the actionperformed method for only one time -
timer.setRepeats(true) == timer
calls the actionPerformed method repeatedly based on specified time
Swing Timer Work
- do the task one time
- do the task repeated time
steps to create swing timer:
- create the actionlistener
- create the timer constructor then pass time and actionlistener in that
- implement the
actionPerformed()
function in which do your task - use
timer.start()
for start the task between the time specified in timer constructor, usetimer.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/
Hamza Yerlikaya
Updated on February 06, 2021Comments
-
Hamza Yerlikaya over 3 years
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.
-
Hamza Yerlikaya almost 15 yearsThanks, 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.
-
Brett almost 15 yearsIIRC, you shouldn't use javax.swing.Timer off the EDT.
-
misty over 7 yearsI think I love you right now! :D Thank you very much!
-
Lightfire228 almost 7 yearsThis answer suggests that the main thread was finishing before the timer finishes. Since the main thread is special, all other non-daemon threads will also terminate when main() terminates. To avoid this (without using daemon threads) you should get a reference to the timer thread, and in main() call
<timer thread object>.join();
-
Georodin over 3 yearshey your syntax is slightly wrong but I like the simple snippet
ActionListener al=new ActionListener(){//code};
is correct instead ofActionListener al=new ActionListener({//code});