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); } }