Java Swing Timer

2019-01-19 00:08发布

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.

标签: java swing timer
4条回答
放我归山
2楼-- · 2019-01-19 00:49

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);
    }
}
查看更多
看我几分像从前
3楼-- · 2019-01-19 00:51

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楼-- · 2019-01-19 00:52

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/

查看更多
走好不送
5楼-- · 2019-01-19 01:07

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
查看更多
登录 后发表回答