Java Swing Timer:计时器组件

计时器(Timer)组件可以在指定时间间隔触发一个或多个 ActionEvent。设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start() 方法启动该计时器。

例如,以下代码创建并启动一个每秒(该时间由 Timer 构造方法的第一个参数指定)触发一次动作事件的计时器。Timer 构造方法的第二个参数指定接收计时器动作事件的监听器。

  1. int delay=1000; //时间间隔,单位为毫秒
  2. ActionListener taskPerformer=new ActionListener()
  3. {
  4. public void afrfcionPerformed(ActionEvent evt)
  5. {
  6. //具体的任务
  7. }
  8. };
  9. new Timer(delay,taskPerformer).start();

创建 Timer 类时要指定一个延迟参数和一个 ActionListener。延迟参数用于设置初始延迟和事件触发之间的延迟(以毫秒为单位)。启动计时器后,它将在向已注册监听器触发第一个 ActionEvent 之前等待初始延迟。第一个事件之后,每次超过事件间延迟时它都继续触发事件,直到被停止。

创建 Timer 类之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他 ActionListener。如果希望计时器只在第一次时触发然后停止,可以对计时器调用 setRepeats(false)。Timer 类的常用方法如表 1 所示。

方法名称说明
addActionListener(ActionListener 1)将一个动作监听器添加到 Timer
getDelay()返回两次触发动作事件间延迟,以毫秒为单位
isCoalesce()如果 Timer 组合多个挂起的动作事件,则返回 true
isRunning()如果 Timer 正在运行,则返回 true
restart()重新启动 Timer,取消所有挂起的触发并使它按初始延迟触发
setCoalesce(boolean flag)设置 Timer 是否组合多个挂起的 ActionEvent
setDelay(int delay)设置 Timer 的事件间延迟,两次连续的动作事件之间的毫秒数
setLogTimers(boolean flag)启用/禁用计时器日志
setRepeats(boolean flag)如果 flag 为 false,则指示 Timer 只向其监听器发送一次动作事件
start()启动 Timer,使它开始向其监听器发送动作事件
stop()停止 Timer,使它停止向其监听器发送动作事件

例 1

编写一个实例,模拟软件安装过程中显示安装进度信息的进度条。该实例中使用 Timer 类模拟安装软件的实际过程,JProgressBar 类显示相应的进度信息,主要实现过程如下。

(1) 创建一个 JProgressBarDemo1 类并实现 ActionListener 接口和 ChangeListener 接口。

  1. package ch18;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Container;
  5. import java.awt.Dimension;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import javax.swing.JButton;
  9. import javax.swing.JFrame;
  10. import javax.swing.JLabel;
  11. import javax.swing.JPanel;
  12. import javax.swing.JProgressBar;
  13. import javax.swing.Timer;
  14. import javax.swing.event.ChangeEvent;
  15. import javax.swing.event.ChangeListener;
  16. public class JProgressBarDemo1 implements ActionListener,ChangeListener
  17. {
  18. JFrame frame=null;
  19. JProgressBar progressbar;
  20. JLabel label;
  21. Timer timer;
  22. JButton b;
  23. public static void main(String[] agrs)
  24. {
  25. new JProgressBarDemo1(); //创建一个实例化对象
  26. }
  27. }

(2) 在构造方法中对进度条和计时器进行设置。主要代码如下:

  1. public JProgressBarDemo1()
  2. {
  3. frame=new JFrame("软件安装");
  4. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  5. Container contentPane=frame.getContentPane();
  6. label=new JLabel(" ",JLabel.CENTER); //创建显示进度信息的文本标签
  7. progressbar=new JProgressBar(); //创建一个进度条
  8. progressbar.setOrientation(JProgressBar.HORIZONTAL);
  9. progressbar.setMinimum(0);
  10. progressbar.setMaximum(100);
  11. progressbar.setValue(0);
  12. progressbar.setStringPainted(true);
  13. progressbar.addChangeListener(this); //添加事件监听器
  14. //设置进度条的几何形状
  15. progressbar.setPreferredSize(new Dimension(300,20));
  16. progressbar.setBorderPainted(true);
  17. progressbar.setBackground(Color.pink);
  18. //添加启动按钮
  19. JPanel panel=new JPanel();
  20. b=new JButton("安装");
  21. b.setForeground(Color.blue);
  22. //添加事件监听器
  23. b.addActionListener(this);
  24. panel.add(b);
  25. timer=new Timer(100, this); //创建一个计时器,计时间隔为100毫秒
  26. //把组件添加到frame中
  27. contentPane.add(panel,BorderLayout.NORTH);
  28. contentPane.add(progressbar,BorderLayout.CENTER);
  29. contentPane.add(label,BorderLayout.SOUTH);
  30. frame.pack();
  31. frame.setVisible(true);
  32. }

(3) 实现 ActionListener 接口中的 actionPerformed() 方法,在这里控制计时器的开始,以及进度条值的变化。具体代码如下:

  1. //实现事件监听器接口中的方法
  2. public void actionPerformed(ActionEvent e)
  3. {
  4. if(e.getSource()==b)
  5. timer.start();
  6. if(e.getSource()==timer)
  7. {
  8. int value=progressbar.getValue();
  9. if(value<100)
  10. {
  11. progressbar.setValue(++value);
  12. }
  13. else
  14. {
  15. timer.stop();
  16. frame.dispose();
  17. }
  18. }
  19. }

(4) 实现 ChangeListener 接口中的 stateChange() 方法,具体代码如下:

  1. public void stateChanged(ChangeEvent e1) //实现事件监听器接口中的方法
  2. {
  3. int value=progressbar.getValue();
  4. if(e1.getSource()==progressbar)
  5. {
  6. label.setText("目前已完成进度:"+Integer.toString(value)+" %");
  7. label.setForeground(Color.blue);
  8. }
  9. }

(5) 运行程序,默认情况下进度条是 0%,如图 1 所示。


图1 初始效果

单击“安装”按钮后进度会一直发生变化,如图 2 所示。


图2 进度变化效果

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值