Java的1.2版本后提供了一个很方便的Timer类,该类在javax.swing包中。当某些操作需要周期性的执行,就可以使用计时器。可以使用的构造方法:Timer(int a,Object b)创建一个计时器,七种的参数a的单位是毫秒,确定计时器每隔a毫秒“振铃”一次,参数b是计时器的监视器。计时器发生的振铃事件是ActionListener中的方法actionPerformed.因此,当振铃每隔a毫秒发生一次时,方法actionPerformed就被执行一次。当想让计时器只振铃一次时,可以让计时器调用setReapeats(boolean b)方法,参数b的取值false即可。当使用Timer(int a,Object b)创建计时器,对象b就自动地成了计时器的监视器,不必像其他组建(如:按钮)那样,使用特定方法获得监视器,但负责创建监视器的类必须实现接口Actionlistener.如果使用Timer(int a)创建计时器,计时器必须再明显的调用addActionListener(ActionListener listener)方法获得监视器,另外,计时器也可以调用setInitialDelay(int depay)设置首次振铃的延时,如果没有使用该方法进行设置,首次振铃的延时为a。
计时器创建后,使用Timer类的方法start()启动计时器即启动线程。使用Timer类的方法stop()停止计时器,即挂起线程。使用restart()重新启动计时器,即回复线程。下面一个例子:单击“开始”,按钮启动计时器,并将时间显示在文本框中,同时移动文本框在容器中的位置;单击“暂停”按钮计时器暂时停止计时;单击“继续”按钮重新启动计时器。
import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
public class Example
{
public static void main(String[] args)
{
TimeWi Win=new TimeWin();
}
}
class TimeWin extends Frame inplements ActionListener
{
TextField text;
Button bStart,bStop,bContinue;
Timer time;
int =0,start=1;
TimeWin()
{
time=new Timer(1000,this);
text=new Field(10);
bStart=new Button("开始计时");
bStop==new Button("暂停计时");
bContinue=new Button("继续计时");
bStart.addActionListener(this);
bStop.addActionListener(this);
bContinue.addActionListener(this);
setLayout(new FlowLayout());
add(bStart);
add(bStop);
add(bContinue);
add(text);
setSize(500,500);
validate();
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{System.exit(0);
}
}
);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==time)
{
java.util.Date date=new java.util.Date();
String str=date.toString().sustring(11,19);
text.setText("时间:"+str);
int x=text.getBounds().x;
int y=text.getBounds().y;
y=y+2;
text.setLocation(x,y);
}
else if(e.getSource()==bStart)
{
time.start();
}
else if(e.getSource()==bStop)
{
time.stop();
}
else if(e.getSource()==bContinue)
{
time.restart();
}
}
}