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技术站