From abe94e7b76b081c8d1180f1c9b0dea5b2ac2e3e5 Mon Sep 17 00:00:00 2001 From: nxist2202005086 <304907878@qq.com> Date: Sat, 15 Jun 2024 22:47:15 +0800 Subject: [PATCH] Add timer --- timer | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 timer diff --git a/timer b/timer new file mode 100644 index 0000000..932ae46 --- /dev/null +++ b/timer @@ -0,0 +1,138 @@ +import javax.swing.*; +import java.awt.HeadlessException; +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +public class Timer extends JFrame { + private static final String INITIAL_LABEL_TEXT = "00:00:00"; + + // 计数线程 + private CountingThread thread = new CountingThread(); + + // 记录程序开始时间 + private long programStart = System.currentTimeMillis(); + + // 程序一开始就是暂停的 + private long pauseStart = programStart; + + // 程序暂停的总时间 + private long pauseCount = 0; + + private JLabel label = new JLabel(INITIAL_LABEL_TEXT); + + private JButton startPauseButton = new JButton("暂停"); + + private JButton resetButton = new JButton("清零"); + + private ActionListener startPauseButtonListener = new ActionListener() { + public void actionPerformed(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 = new ActionListener() { + public void actionPerformed(ActionEvent e) { + pauseStart = programStart; + pauseCount = 0; + thread.stopped = true; + label.setText(INITIAL_LABEL_TEXT); + startPauseButton.setText("暂停"); + + } + }; + + public Timer(String title) throws HeadlessException { + super(title); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setLocation(300, 300); + setResizable(true); + setupBorder(); + setupLabel(); + if (thread.stopped == false) { + setupButtonsPanel(); + } + + + startPauseButton.addActionListener(startPauseButtonListener); + resetButton.addActionListener(resetButtonListener); + + thread.start(); // 计数线程一直就运行着 + } + + // 为窗体面板添加边框 + private void setupBorder() { + + JPanel contentPane = new JPanel(new BorderLayout()); + contentPane.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50)); + this.setContentPane(contentPane); + } + + //配置按钮 + private void setupButtonsPanel() { + JPanel panel = new JPanel(new FlowLayout()); + panel.add(startPauseButton); + panel.add(resetButton); + add(panel, BorderLayout.SOUTH); + } + + // 配置标签 + private void setupLabel() { + label.setHorizontalAlignment(SwingConstants.CENTER); + label.setFont(new Font(label.getFont().getName(), label.getFont().getStyle(), 40)); + this.add(label, BorderLayout.CENTER); + } + + private class CountingThread extends Thread { + + public boolean stopped = false; + + private CountingThread() { + setDaemon(true); + } + + @Override + public void run() { + 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(long elapsed) { + int hour, minute, second, milli; + 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", hour, minute, second); + } + } +}