计时器
//TestStopWatch.java
package myprojects.teststopwatch;
import java.awt.*;
import java.awt.event.*;
class TestStopWatch extends Frame {
public TestStopWatch() {
this.add(new StopWatch());
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
}
public static void main(String args[]) {
System.out.println("Starting TestStopWatch...");
TestStopWatch mainFrame = new TestStopWatch();
mainFrame.setSize(400, 400);
mainFrame.setTitle("TestStopWatch");
mainFrame.setVisible(true);
}
}
//StopWatch.java
package myprojects.teststopwatch;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;
public class StopWatch extends Canvas implements Runnable { //StopWatch继承了Canvas组件类 //实现Runnable接口,实现实时刷新
long startTime=0; //鼠标按下时的时间
long endTime=0; //鼠标松开时的时间
boolean bStart=false;
public StopWatch(){
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
}
protected void processMouseEvent(MouseEvent e){
if(e.getID()==MouseEvent.MOUSE_PRESSED){
bStart=true;
new Thread(this).start(); //启动 重绘刷 新线程
startTime=endTime=System.currentTimeMillis(); //获取按下鼠标时的当前时间
repaint(); //按下鼠标时重绘组件,实现计时器归零
}
else if(e.getID()==MouseEvent.MOUSE_RELEASED){
endTime=System.currentTimeMillis(); //获取放开鼠标时的当前时间
repaint(); //并且重绘组件
bStart=false;
}
}
public void paint(Graphics g){ //覆盖Component类的paint()方法
SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");//注意HH:mm:ss几个字母的大小写
Date elapsedTime=null; //定义鼠标按下和松开之间的时间差
try{
elapsedTime=sdf.parse("00:00:00");//设置elapsedTime初始值为00:00:00,编译时提示可能出现异常,要try一下
}
catch(Exception e){
e.printStackTrace();
}
elapsedTime.setTime(elapsedTime.getTime()+endTime-startTime);
String strTime=sdf.format(elapsedTime); //时间差elapsedTime格式化后的字符串就是要在计时器上显示的内容
g.fill3DRect(0,0,78,28,true); //设置背景
g.setColor(Color.WHITE); //设置字体颜色
g.drawString(strTime,10,20); //绘制字符串
}
public void run() {
// TODO: Add your code here
while(bStart){ //循环刷新
try{
Thread.sleep(500); //500毫秒刷新一次
}
catch(Exception e){
e.printStackTrace();
}
endTime=System.currentTimeMillis();
repaint();
}
}
}