1 Java Swing Timer:计时器组件
计时器(Timer)组件可以在指定时间间隔触发一个或多个 ActionEvent。
设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start() 方法启动该计时器。 例如,以下代码创建并启动一个每秒(该时间由 Timer 构造方法的第一个参数指定)触发一次动作事件的计时器。Timer 构造方法的第二个参数指定接收计时器动作事件的监听器。
int delay= 1000 ;
ActionListener taskPerformer= new ActionListener ( )
{
public void afrfcionPerformed ( ActionEvent evt)
{
}
} ;
new Timer ( delay, taskPerformer) . start ( ) ;
创建 Timer 类时要指定一个延迟参数和一个 ActionListener。延迟参数用于设置初始延迟和事件触发之间的延迟(以毫秒为单位)。
启动计时器后,它将在向已注册监听器触发第一个 ActionEvent 之前等待初始延迟。第一个事件之后,每次超过事件间延迟时它都继续触发事件,直到被停止。 创建 Timer 类之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他 ActionListener。如果希望计时器只在第一次时触发然后停止,可以对计时器调用 setRepeats(false)。
2 常用方法
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,使它停止向其监听器发送动作事件
3 示例:模拟软件安装过程中显示安装进度信息的进度条
import javax. swing. *;
import javax. swing. event. ChangeEvent;
import javax. swing. event. ChangeListener;
import java. awt. *;
import java. awt. event. ActionEvent;
import java. awt. event. ActionListener;
public class JProgressBarDemo implements ActionListener , ChangeListener {
JFrame frame= null;
JProgressBar progressbar;
JLabel label;
Timer timer;
JButton b;
public static void main ( String[ ] agrs) {
new JProgressBarDemo ( ) ;
}
public JProgressBarDemo ( ) {
frame= new JFrame ( "软件安装" ) ;
frame. setDefaultCloseOperation ( JFrame. EXIT_ON_CLOSE) ;
Container contentPane= frame. getContentPane ( ) ;
label= new JLabel ( " " , JLabel. CENTER) ;
progressbar= new JProgressBar ( ) ;
progressbar. setOrientation ( JProgressBar. HORIZONTAL) ;
progressbar. setMinimum ( 0 ) ;
progressbar. setMaximum ( 100 ) ;
progressbar. setValue ( 0 ) ;
progressbar. setStringPainted ( true ) ;
progressbar. addChangeListener ( this ) ;
progressbar. setPreferredSize ( new Dimension ( 300 , 20 ) ) ;
progressbar. setBorderPainted ( true ) ;
progressbar. setBackground ( Color. pink) ;
JPanel panel= new JPanel ( ) ;
b= new JButton ( "安装" ) ;
b. setForeground ( Color. blue) ;
b. addActionListener ( this ) ;
panel. add ( b) ;
timer= new Timer ( 100 , this ) ;
contentPane. add ( panel, BorderLayout. NORTH) ;
contentPane. add ( progressbar, BorderLayout. CENTER) ;
contentPane. add ( label, BorderLayout. SOUTH) ;
frame. pack ( ) ;
frame. setVisible ( true ) ;
}
public void actionPerformed ( ActionEvent e) {
if ( e. getSource ( ) == b)
timer. start ( ) ;
if ( e. getSource ( ) == timer) {
int value= progressbar. getValue ( ) ;
if ( value< 100 ) {
progressbar. setValue ( ++ value) ;
}
else {
timer. stop ( ) ;
frame. dispose ( ) ;
}
}
}
public void stateChanged ( ChangeEvent e1) {
int value= progressbar. getValue ( ) ;
if ( e1. getSource ( ) == progressbar) {
label. setText ( "目前已完成进度:" + Integer. toString ( value) + " %" ) ;
label. setForeground ( Color. blue) ;
}
}
}
4 运行效果