2.2.4 Timer类
除了EventQueue的invokeAndWait()与invokeLater()方法外,我们还可以使用Timer类来创建在事件分发线程上执行的动作。Timer提供了一种在预定义的时间之后通知ActionListener的方法。计时器可以重复通知监听吕在,或者是只通知一次。
创建计时器对象
下面是用于创建在ActionListener调用之间指定毫秒时延的Timer的构造器:
public Timer(int delay, ActionListener actionListener); // 1 second interval Timer timer = new Timer(1000, anActionListener);
使用计时器对象
在创建了Timer对象之后,我们需要启动start()。一旦启动了Timer,ActionListener就会在指定的时间之后得到通知。如果系统繁忙,延时会更长,但绝不会更短。
如果我们需要停止Timer,我们可以调用stop()方法。Timer同时还有一个restart()方法,这个方法会调用stop()与start(),重新启动时延间隔。
为了演示了的需要,列表2-8定义了一个只是简单的输出消息的ActionListener。然后我们创建一个Timer每半秒调用这个监听器。在我们创建计时器之后,我们需要启动这个计时器。
/** * */ package swingstudy.ch02; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Timer; /** * @author lenovo * */ public class TimerSample { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Runnable runner = new Runnable() { public void run() { ActionListener actionListener = new ActionListener() { public void actionPerformed(ActionEvent event) { System.out.println("Hello world timer"); } }; Timer timer = new Timer(500, actionListener); timer.start(); } }; EventQueue.invokeLater(runner); } }
Timer属性
表2-1列出Timer的六个属性。四个允许我们自定义计时器的行为。running告诉我们计时器是否启动而没有停止,而actionListeners会为我们提供动作监听器列表。
属性名 |
数据类型 |
可访问性 |
actionListeners |
ActionListener[] |
只读 |
coalesce |
boolean |
读写 |
delay |
int |
读写 |
initialDelay |
int |
读写 |
repeats |
boolean |
读写 |
running |
boolean |
只读 |
delay属性与构造函数的参数相同。如果我们改变一个运行计时器的时延,只有已存在的时延超时时才会使用新的时延。
initialDelay属性使得我们在第一次运行之后除了间隔时延以外还可以其他的启动时延。例如,如果我们在前一个小时并不希望执行一件任务,但是我们希望在之后每15分钟执行一次,我们就需要在启动计时器这前修改initialDelay设置。在默认情况下,在构造函数中initialDelay与delay属性设置为相同的设置。
repeats属性默认情况下设置为true,从而重复运行计时器。当设置为false时,计时器只通知动作监听器一次。然而我们需要重新启动restart()计显示器来再次触发监听器。非重复计时器可以用于在触发事件之后发生的一次通知。
coalesce属性允许一个繁忙的系统当已注册的ActionListener对象有新事件需要触发时丢弃还没有发生的通知。在默认情况下,coalesce的值设置为true。这就意味着如果一个计时器每500毫秒运行一次,但是系统十分繁忙且已经有2秒没有响应,计时器只需要发送一条消息,而不需要发送丢失的消息。如果这个属性设置为false,那么就需要发送四条消息。
除了所列出的属性以外,我们还可以用下面的代码来允许日志消息:
Timer.setLogTimers(true);
日志消息对于没有可视化元素的动作十分有用,使得我们知道事件的发生。