Java实现的计时器【秒表】功能示例

Java实现计时器【秒表】功能示例攻略

1. 功能概述

Java实现计时器功能的主要思路是通过多线程实现,秒表的开始、暂停、重置等功能可以通过控制线程状态来实现。具体需要实现以下功能:
- 开始计时:启动一个新线程,用于定时更新计时器的时间并显示在界面上。
- 暂停计时:暂停计时器的定时更新线程,但计时器的时间不变。
- 重置计时:将计时器的时间重置为0,同时将计时器定时更新的线程停止。

2. 实现步骤

2.1 创建计时器界面

创建一个新的Java图形用户界面(GUI)窗口,在窗口上添加计时器显示区域、开始按钮、暂停按钮、重置按钮等控件,并给每个控件添加对应的事件监听器。

2.2 实现计时器逻辑

创建一个新的Java类,实现计时器的逻辑。该类需要继承Thread类,并实现以下方法:
- run()方法:线程执行的主体代码,用于更新计时器的时间并显示在界面上。
- start()方法:启动线程。
- pause()方法:暂停线程。
- reset()方法:重置计时器。

2.3 实现事件监听器

实现计时器界面上的各种事件监听器,例如:
- 开始按钮事件监听器:当用户单击开始按钮时,创建一个新的计时器线程并启动。
- 暂停按钮事件监听器:当用户单击暂停按钮时,暂停计时器线程,但计时器的时间不变。
- 重置按钮事件监听器:当用户单击重置按钮时,重置计时器,并停止计时器线程。

2.4 运行程序

将计时器界面和计时器逻辑整合在一起,编译并运行程序。

3. 示例说明

3.1 示例一

假设计时器界面上有一个JLabel控件用于显示计时器的时间,一个JButton控件用于开始计时,一个JButton控件用于暂停计时,一个JButton控件用于重置计时。则可以实现如下代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TimerDemo implements ActionListener {
    private JLabel timerLabel;
    private JButton startButton, pauseButton, resetButton;
    private TimerThread timerThread;

    public TimerDemo() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        timerLabel = new JLabel("00:00:000");
        startButton = new JButton("Start");
        pauseButton = new JButton("Pause");
        resetButton = new JButton("Reset");

        startButton.addActionListener(this);
        pauseButton.addActionListener(this);
        resetButton.addActionListener(this);

        panel.add(timerLabel);
        panel.add(startButton);
        panel.add(pauseButton);
        panel.add(resetButton);

        frame.add(panel);
        frame.setSize(300, 100);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == startButton) {
            timerThread = new TimerThread(timerLabel);
            timerThread.start();
        } else if (e.getSource() == pauseButton) {
            timerThread.pause();
        } else if (e.getSource() == resetButton) {
            timerThread.reset();
        }
    }

    public static void main(String[] args) {
        new TimerDemo();
    }
}

class TimerThread extends Thread {
    private JLabel timerLabel;
    private boolean isRunning, isPaused;
    private long startTime, pauseTime, elapsedTime;

    public TimerThread(JLabel timerLabel) {
        this.timerLabel = timerLabel;
        isRunning = true;
    }

    public void run() {
        startTime = System.currentTimeMillis();
        while (isRunning) {
            elapsedTime = System.currentTimeMillis() - startTime - pauseTime;
            updateTimerLabel();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void pause() {
        isPaused = true;
        pauseTime = elapsedTime;
    }

    public void reset() {
        isPaused = false;
        isRunning = false;
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isRunning = true;
        startTime = System.currentTimeMillis();
        pauseTime = 0;
        elapsedTime = 0;
        updateTimerLabel();
    }

    private void updateTimerLabel() {
        int minutes = (int) (elapsedTime / 60000);
        int seconds = (int) (elapsedTime / 1000) % 60;
        int millis = (int) (elapsedTime % 1000);

        String time = String.format("%02d:%02d:%03d", minutes, seconds, millis);
        timerLabel.setText(time);
    }
}

该程序创建了一个带有开始、暂停、重置按钮和计时器显示区域的窗口,当用户点击开始按钮时,程序将创建一个新的计时器线程并启动,计时器线程每隔10毫秒更新计时器的时间并显示在窗口上。当用户单击暂停按钮时,程序将暂停计时器线程,但计时器的时间不变。当用户单击重置按钮时,程序将重置计时器,并停止计时器线程。

3.2 示例二

假设计时器界面上有一个JTextField控件用于用户输入计时器时间,一个JLabel控件用于显示计时器的时间,一个JButton控件用于开始计时,一个JButton控件用于暂停计时,一个JButton控件用于重置计时。则可以实现如下代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TimerDemo implements ActionListener {
    private JTextField timeText;
    private JLabel timerLabel;
    private JButton startButton, pauseButton, resetButton;
    private TimerThread timerThread;

    public TimerDemo() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();

        timeText = new JTextField(10);
        timerLabel = new JLabel("00:00:000");
        startButton = new JButton("Start");
        pauseButton = new JButton("Pause");
        resetButton = new JButton("Reset");

        startButton.addActionListener(this);
        pauseButton.addActionListener(this);
        resetButton.addActionListener(this);

        panel.add(timeText);
        panel.add(timerLabel);
        panel.add(startButton);
        panel.add(pauseButton);
        panel.add(resetButton);

        frame.add(panel);
        frame.setSize(400, 100);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == startButton) {
            long time = Long.parseLong(timeText.getText());
            timerThread = new TimerThread(time, timerLabel);
            timerThread.start();
        } else if (e.getSource() == pauseButton) {
            timerThread.pause();
        } else if (e.getSource() == resetButton) {
            timerThread.reset();
        }
    }

    public static void main(String[] args) {
        new TimerDemo();
    }
}

class TimerThread extends Thread {
    private JLabel timerLabel;
    private boolean isRunning, isPaused;
    private long startTime, pauseTime, elapsedTime, totalTime;

    public TimerThread(long time, JLabel timerLabel) {
        this.totalTime = time * 1000;
        this.timerLabel = timerLabel;
        isRunning = true;
    }

    public void run() {
        startTime = System.currentTimeMillis();
        while (isRunning) {
            elapsedTime = System.currentTimeMillis() - startTime - pauseTime;
            updateTimerLabel();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            if (elapsedTime >= totalTime) {
                break;
            }
        }
    }

    public void pause() {
        isPaused = true;
        pauseTime = elapsedTime;
    }

    public void reset() {
        isPaused = false;
        isRunning = false;
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isRunning = true;
        startTime = System.currentTimeMillis();
        pauseTime = 0;
        elapsedTime = 0;
        updateTimerLabel();
    }

    private void updateTimerLabel() {
        int minutes = (int) ((totalTime - elapsedTime) / 60000);
        int seconds = (int) ((totalTime - elapsedTime) / 1000) % 60;
        int millis = (int) ((totalTime - elapsedTime) % 1000);

        String time = String.format("%02d:%02d:%03d", minutes, seconds, millis);
        timerLabel.setText(time);
    }
}

该程序创建了一个带有开始、暂停、重置按钮和计时器显示区域的窗口,当用户在文本框中输入计时器时间并单击开始按钮时,程序将创建一个新的计时器线程并启动,计时器线程每隔10毫秒更新计时器的时间并显示在窗口上。当计时器的时间达到用户输入的时间时,程序将停止计时器线程。当用户单击暂停按钮时,程序将暂停计时器线程,但计时器的时间不变。当用户单击重置按钮时,程序将重置计时器,并停止计时器线程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的计时器【秒表】功能示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • SpringBoot通过ThreadLocal实现登录拦截详解流程

    下面是详细讲解“SpringBoot通过ThreadLocal实现登录拦截详解流程”的完整攻略。 1. 概述 在SpringBoot中,实现登录拦截的一种方式是通过ThreadLocal来实现。具体来说,通过在登录时将用户信息存储在ThreadLocal中,在其他请求中通过ThreadLocal来获取用户信息,以达到登录拦截的目的。 2. 实现流程 以下是通…

    Java 2023年5月20日
    00
  • 利用java读取web项目中json文件为map集合方法示例

    以下是“利用java读取web项目中json文件为map集合方法示例”的完整攻略: 1. 引入依赖 首先需要引入jackson的依赖,可以使用Maven等项目管理工具来自动引入依赖,也可以手动下载jar包引入到项目中。具体的依赖代码如下: <dependency> <groupId>com.fasterxml.jackson.core…

    Java 2023年5月26日
    00
  • JavaScript实现九九乘法表的简单实例

    以下是“JavaScript实现九九乘法表的简单实例”的完整攻略。 展示九九乘法表 首先,在HTML文件中创建一个表格,用于展示九九乘法表: <table> <thead> <tr> <th>&times;</th> <th>1</th> <th>2&lt…

    Java 2023年6月15日
    00
  • JavaCV调用百度AI实现人脸检测方法详解

    JavaCV调用百度AI实现人脸检测方法详解 简介 本文将介绍如何使用JavaCV和百度AI平台实现人脸检测。JavaCV是一个基于OpenCV和FFmpeg库的Java接口。百度AI平台是一个提供机器视觉、语音识别、自然语言处理等人工智能服务的云端平台。通过将JavaCV和百度AI平台相结合,我们可以轻松实现人脸检测功能。 步骤 1. 注册百度AI平台账号…

    Java 2023年5月20日
    00
  • Mac下安装配置Maven并在IDEA中配置的详细教程

    下面是Mac下安装配置Maven并在IDEA中配置的详细教程。 安装Maven 下载Maven 在Maven官网下载页面中,选择合适的Maven版本进行下载(https://maven.apache.org/download.cgi)。目前最新版本为3.8.3。 解压Maven安装包 解压下载下来的Maven安装包,将其中的文件解压到本地目录。可以在终端输入…

    Java 2023年5月20日
    00
  • 一篇文章带你了解Java 中序列化与反序列化

    一篇文章带你了解Java 中序列化与反序列化 引言 在Java编程中,可能需要将对象存储在文件中或通过网络传输。使用序列化来处理这些任务是很常见的方法。本篇文章将介绍Java中的序列化和反序列化的概念和用法,给你提供一个完整的攻略。 Serializable 接口 Java 中的序列化和反序列化要求被序列化的类必须实现 Serializable 接口。实现 …

    Java 2023年5月26日
    00
  • java string类方法深入解析

    标题:Java String类方法深入解析 正文: Java中的String类是用来存储和操作字符串的类,其中包含了许多有用的方法。在本篇攻略中,我们将深入解析Java String类的一些常用方法。 substring substring方法可以用来截取字符串中的一部分,它接收两个参数,分别是截取子串的起始位置和终止位置,返回值为截取后的新字符串。假设有以…

    Java 2023年5月26日
    00
  • Java Spring boot实现生成二维码

    让我来为您详细讲解“Java Spring boot实现生成二维码”的完整攻略。 1. 引入依赖 首先,我们需要在pom.xml文件中引入zxing库,该库是一个用于生成二维码的开源库。具体实现如下: <dependency> <groupId>com.google.zxing</groupId> <artifact…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部