import javax.swing.*;importjava.awt.HeadlessException;importjava.awt.BorderLayout;importjava.awt.FlowLayout;importjava.awt.Font;importjava.awt.event.ActionListener;importjava.awt.event.ActionEvent;/*** 计时器*/
public class Timer extendsJFrame {/****/
private static final long serialVersionUID = 1L;private static final String INITIAL_LABEL_TEXT = "00:00:00 000";//计数线程
private CountingThread thread = newCountingThread();//记录程序开始时间
private long programStart =System.currentTimeMillis();//程序一开始就是暂停的
private long pauseStart =programStart;//程序暂停的总时间
private long pauseCount = 0;private JLabel label = newJLabel(INITIAL_LABEL_TEXT);private JButton startPauseButton = new JButton("开始");private JButton resetButton = new JButton("清零");private ActionListener startPauseButtonListener = newActionListener() {public voidactionPerformed(ActionEvent e) {if(thread.stopped) {
pauseCount+= (System.currentTimeMillis() -pauseStart);
thread.stopped= false;
startPauseButton.setText("暂停");
}else{
pauseStart=System.currentTimeMillis();
thread.stopped= true;
startPauseButton.setText("继续");
}
}
};private ActionListener resetButtonListener = newActionListener() {public voidactionPerformed(ActionEvent e) {
pauseStart=programStart;
pauseCount= 0;
thread.stopped= true;
label.setText(INITIAL_LABEL_TEXT);
startPauseButton.setText("开始");
}
};public Timer(String title) throwsHeadlessException {super(title);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(300, 300);
setResizable(false);
setupBorder();
setupLabel();
setupButtonsPanel();
startPauseButton.addActionListener(startPauseButtonListener);
resetButton.addActionListener(resetButtonListener);
thread.start();//计数线程一直就运行着
}//为窗体面板添加边框
private voidsetupBorder() {
JPanel contentPane= new JPanel(newBorderLayout());
contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));this.setContentPane(contentPane);
}//配置按钮
private voidsetupButtonsPanel() {
JPanel panel= new JPanel(newFlowLayout());
panel.add(startPauseButton);
panel.add(resetButton);
add(panel, BorderLayout.SOUTH);
}//配置标签
private voidsetupLabel() {
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setFont(new Font(label.getFont().getName(), label.getFont().getStyle(), 40));this.add(label, BorderLayout.CENTER);
}//程序入口
public static voidmain(String[] args) {try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exception e) {
e.printStackTrace();
}
Timer frame= new Timer("计时器");
frame.pack();
frame.setVisible(true);
}private class CountingThread extendsThread {public boolean stopped = true;privateCountingThread() {
setDaemon(true);
}
@Overridepublic voidrun() {while (true) {if (!stopped) {long elapsed = System.currentTimeMillis() - programStart -pauseCount;
label.setText(format(elapsed));
}try{
sleep(1); //1毫秒更新一次显示
} catch(InterruptedException e) {
e.printStackTrace();
System.exit(1);
}
}
}//将毫秒数格式化
private String format(longelapsed) {inthour, minute, second, milli;
milli= (int) (elapsed % 1000);
elapsed= elapsed / 1000;
second= (int) (elapsed % 60);
elapsed= elapsed / 60;
minute= (int) (elapsed % 60);
elapsed= elapsed / 60;
hour= (int) (elapsed % 60);return String.format("%02d:%02d:%02d %03d", hour, minute, second, milli);
}
}
}