java.lang.Object --javax.swing.Timer
使用Timer组件可以让你在一段时间内依次做出你指定的操作,这在动画的展示上非常有用。如果你有用过如ACDsee这类的看图 软件,你可以发现这类软件都会提供一种功能,那就是自动换图的功能,而且也可以让你设置换图时间间隔的长短。在java中, swing的Timer组件就可以让你做到这样的功能,而且非常容易使用,下面我们先来看Timer的构造函数。
Timer构造函数:
Timer(int delay,ActionListener listener):建立一个Timer组件,并在每一次delay的时间点上触发ActionEvent. 使用Timer组件它会在根据你所给予的delay时间,周期性的触发ActionEvent事件,如果你要处理这个事件,你必须实作 ActionListener界面所定义的actionPerformed()方法。要开始激活Timer组件,你可以用start()方法,要停止Timer组件可以使用 stop()方法,要从新激活Timer组件可以使用restart()方法,若只想Timer组件只触发一次ActionEvent事件,可利用 setRepeats(false)方法,将参数设为false,若要设置delay时间则可用setDelay()方法。
事实上使用Timer组件表示在程序背后是利用Threads在运行Timer的工作,因此你当然也可以利用Thread的功能来自行制造出这 样的效果,不过这不在本书的讨论范围内,下面的范例我们实作一个显示图程序,可让用户调整显示图时间的快慢。
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import java.util.*;
public class TimerDemo1 implements ActionListener, ChangeListener {
JFrame f = null;
ImageIcon[] icons;
JSlider slider1;
JLabel label;
JToggleButton toggleb1, toggleb2;
JButton b;
javax.swing.Timer timer;
int index = 0;
public TimerDemo1() {
f = new JFrame("Timer Example");
Container contentPane = f.getContentPane();
icons = new ImageIcon[5];
for (int i = 0; i < 5; i++)
icons[i] = new ImageIcon(".\\icons\\" + (i + 1) + ".jpg");
label = new JLabel(icons[0]);
JPanel panel1 = new JPanel();
panel1.setLayout(new GridLayout(2, 1));
slider1 = new JSlider();
slider1.setPaintTicks(true);
slider1.setMajorTickSpacing(20);
slider1.setMinorTickSpacing(10);
slider1.setPaintLabels(true);
slider1.addChangeListener(this);
panel1.add(slider1);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1, 3));
toggleb1 = new JToggleButton("Start");
toggleb1.addActionListener(this);
buttonPanel.add(toggleb1);
b = new JButton("Restart");
b.addActionListener(this);
buttonPanel.add(b);
toggleb2 = new JToggleButton("Don't Repeat");
toggleb2.addActionListener(this);
buttonPanel.add(toggleb2);
panel1.add(buttonPanel);
Hashtable table = new Hashtable();
table.put(new Integer(0), new JLabel("е"));
table.put(new Integer(50), new JLabel("い"));
table.put(new Integer(100), new JLabel("篊"));
slider1.setLabelTable(table);
/*
* 由于java的Timer组件有两种,一种是javax.swing.Timer,一种是java.util.Timer,若我们在程序中import了这两种
* package,则系统将不晓得到底要产生哪种Timer组件,就如同本范例一般,因此我们必须在new Timer组件的同时,指
* 定要new出哪一种类型的Timer组件。因此我们必须在new Timer组件的同时,指定要new出哪一种类型的Timer组件,在
* 此我们当然是要产生Swing的Timer组件,在此我们当然是要产生Swing的Timer组件。
*/
timer = new javax.swing.Timer(slider1.getValue() * 10, this);
contentPane.add(label, BorderLayout.CENTER);
contentPane.add(panel1, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new TimerDemo1();
}
// 处理按钮事件与Timer事件。
public void actionPerformed(ActionEvent e) {
if (e.getSource() == toggleb1) {// 当用户按下"start"按钮时,Timer开始运行,且"Start"按钮会变成"Stop",若用户再次按下"stop"按钮,则Timer暂停
// 运行,且"stop"按钮变成"start".
if (e.getActionCommand().equals("Start")) {
timer.start();
toggleb1.setText("Stop");
}
if (e.getActionCommand().equals("Stop")) {
timer.stop();
toggleb1.setText("Start");
}
}
// 当用户按下"Don't Repeat"按钮时,则Timer事件只触发一次,若再按一次"Don't Repeat"按钮,则Timer继续运行。
if (e.getSource() == toggleb2) {
if (timer.isRepeats()) {
timer.setRepeats(false);
} else {
timer.setRepeats(true);
timer.start();
}
}
// 当用户按下"Restart"按钮时,则Timer组件的delay值恢复成初如值,并重新运行Timer.
if (e.getSource() == b) {
slider1.setValue(50);
timer.restart();
}
// 处理Timer产生的ActionEvent事件,每次时间一到delay所设置的时间,label上的图片就会更换一次。
if (e.getSource() == timer) {
if (index == 5)
index = 0;
label.setIcon(icons[index]);
label.repaint();
// f.pack(); //若要窗口随图形大小变化,可加入此行.
index++;
}
}
// 处理slider所产生的ChangeEvent事件,当用户移动slider1的滑动杆时,等于从新设置Timer的delay时间。
public void stateChanged(ChangeEvent e1) {
timer.setDelay(slider1.getValue() * 10);
}
}