问题
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.
回答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);
}
}
回答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) == timercalls the actionperformed method for only one timetimer.setRepeats(true) == timercalls 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
回答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(...)
回答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/
来源:https://stackoverflow.com/questions/64141417/how-to-use-swing-timer-for-delaying-actions