62,616
社区成员
发帖
与我相关
我的任务
分享
package c_port_packageBJTeacher;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.*;
import java.util.Date;
import java.text.SimpleDateFormat;
public class StopWatch extends JFrame {
JButton btnStart, btnStop;
JLabel label;
Timer timer;//计时器
public StopWatch() {
label = new JLabel("00:00:00.000");
btnStart = new JButton("start");
btnStop = new JButton("stop");
final int delay = 100;//时间间隔(动作事件间延迟的毫秒数)
final Date startTime = new Date();//类 Date 表示特定的瞬间,精确到毫秒
final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.S");//时间格式化
final Action taskPerformer = new AbstractAction() {//计时器动作事件的侦听器
public void actionPerformed(ActionEvent evt) {
/*
* System.currentTimeMillis() 返回以毫秒为单位的当前时间; 时区为当前所在的时区 北京时间东8区
* startTime.getTime() 返回自 1970/1/1 00:00:00 GMT 以来此 Date 对象表示的毫秒数; 时区为本初子午线所在的时区可以当做东0区
* 28800000 是8小时的毫秒数 因为前面两种方法取得的毫秒数不在同一时区 所以必须得统一 即减去相差的8个时区的8小时的毫秒数
*
* 这个是该程序的重点难点之处,请参照API中关于日期时间类的介绍
*/
Date d = new Date(System.currentTimeMillis()
- startTime.getTime() - 28800000);
label.setText(sdf.format(d));//将时间格式化后显示在标签上
label.repaint();//重新绘制标签
}
};
btnStart.addActionListener(new ActionListener() {//按钮“start” 事件处理
public void actionPerformed(ActionEvent evt) {
startTime.setTime(new Date().getTime());//重置时间
/*创建一个以taskPerformer为动作侦听器,动作事件延迟为delay毫秒的计时器
*即每隔0.1(delay = 100)秒触发一次事件
* 这个Timer类,具体用法自己查API
*/
timer = new Timer(delay, taskPerformer);
timer.start();//启动计时器
}
});
btnStop.addActionListener(new ActionListener() {//按钮“stop” 事件处理
public void actionPerformed(ActionEvent evt) {
if (timer != null && timer.isRunning())//如果计时器为创建或不在运行状态下
timer.stop();//停止计时器 ;若计时器不存在或没有运行则会抛出异常所以要先判断一下
}
}); Container c = getContentPane();
c.add(label, BorderLayout.NORTH);
c.add(btnStart, BorderLayout.CENTER);
c.add(btnStop, BorderLayout.SOUTH);
} public static void main(String[] args) {
//下面 自己查看API或者baidu或者google,主要在于自己多动手
javax.swing.SwingUtilities.invokeLater(new Runnable() {//AWT 事件指派线程上的异步执行
public void run() {
createAndShowGUI();//作用在于更新组件及刷新计时器
}
}); } private static void createAndShowGUI() {
StopWatch window = new StopWatch();
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);
}
}