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日

相关文章

  • Java文件管理操作的知识点整理

    下面是“Java文件管理操作的知识点整理”的完整攻略。 什么是Java文件管理操作 Java文件管理操作是指在Java程序中对文件进行创建、读取、写入、删除等文件操作的过程。通过Java文件管理操作,我们可以对文件进行增删改查、复制和移动等常见文件操作,便于我们在Java程序中处理文件相关业务逻辑。 Java文件管理操作的基本流程 Java文件管理操作的基本…

    Java 2023年5月20日
    00
  • tomcat性能优化(性能总览)

    Tomcat性能优化(性能总览) 为了提高Tomcat的性能,可以考虑以下几个方面的优化: 1. 确定性能瓶颈 我们需要确定Tomcat的性能瓶颈。可以使用JProfiler等工具来对Tomcat进行性能分析和优化。通过分析Tomcat的CPU利用率、内存使用情况、I/O和网络延迟情况等指标,可以帮助我们定位性能瓶颈。 2. Tomcat服务器配置优化 2.…

    Java 2023年5月19日
    00
  • java遍历读取xml文件内容

    下面我将详细讲解Java遍历读取XML文件内容的完整攻略。 一、使用DOM方式读取XML文件 引入相关依赖:需要在项目中引入相关的dom4j和jaxen库。 创建SAXReader对象,利用SAXReader对象解析XML文件。 SAXReader reader = new SAXReader(); Document document = reader.re…

    Java 2023年5月19日
    00
  • Mybatis实现分表插件

    分库分表是常见的数据库水平扩展方案之一,Mybatis实现分表插件,可以对数据库进行动态分表,方便进行扩展和管理。下面我将为您详细介绍如何实现Mybatis分表插件,并提供两条示例。 什么是Mybatis分表插件? Mybatis分表插件是一种Mybatis的插件机制,可以应对分表的需求。通常情况下,将业务数据切分到多个表中,可以极大地提高多线程并发执行时的…

    Java 2023年5月20日
    00
  • Java对象的复制三种方式(小结)

    下面是对于“Java对象的复制三种方式(小结)”这一话题的详细讲解。 背景介绍 在Java中,我们经常需要拷贝数据以及对象。如何进行对象的拷贝并不是一件简单的事情。在Java中,对象的拷贝可以分为三种方式,分别是浅拷贝、深拷贝和序列化。 概念解释 浅拷贝:对象的浅拷贝只是复制了一个对应的指针,并没有新建一个对象。 深拷贝:深拷贝则是创建一个新的对象,并将原有…

    Java 2023年5月26日
    00
  • 基于Java创建一个订单类代码实例

    以下是基于Java创建一个订单类的完整攻略过程: 1. 定义订单类 在创建订单类之前,需要先明确订单类需要存储哪些信息,例如订单编号、订单创建时间、订单金额等等,再根据这些信息定义订单类的属性。同时,还需要定义订单类的基本行为,例如添加商品到订单、计算订单总金额等等,并将这些功能定义为订单类的方法。 public class Order { private …

    Java 2023年5月23日
    00
  • JpaRepository如何实现增删改查并进行单元测试

    JpaRepository是Spring Data JPA中的一个接口,该接口为开发人员提供了一种简单的方式来实现增删改查等常见操作。下面是JpaRepository如何实现增删改查并进行单元测试的完整攻略。 1. 增加数据 JpaRepository提供了一个save()方法来保存一个实体对象。该方法可以用于添加数据。以下是示例代码: @Service p…

    Java 2023年5月20日
    00
  • 深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)

    让我来为你介绍一下“深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)”的完整攻略。 首先,这篇文章主要介绍如何深入学习和理解MyBatis与Spring集成的SqlSessionFactoryBean,并重构该类以更好地适应不同的应用场景。下面我会根据文章的结构和内容,逐一为你进行讲解和说明。 第一部分:介绍Sq…

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