最近在完成学校课程的java平时作业,要实现一个计时器,包含开始、暂停以及重置三个功能。由于老师规定要用这个timer类,也就去学习了一下,顺便记录一下。

首先呢去查了一下java手册上的东西,发现timer的构造函数是这么解释的(拿翻译机翻译了)

public class Timer
extends
Object implements
Serializable

在指定时间间隔触发一个或多个 ActionEvent。一个示例用法是动画对象,它将 Timer 用作绘制其帧的触发器。

设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start 方法启动该计时器。例如,以下代码创建并启动一个每秒(该时间由 Timer 构造方法的第一个参数指定)触发一次动作事件的计时器。Timer 构造方法的第二个参数指定接收计时器动作事件的侦听器。

int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
}
};
new Timer(delay, taskPerformer).start();

构造 Timer 时要指定一个延迟参数和一个 ActionListener。延迟参数用于设置初始延迟和事件触发之间的延迟(以毫秒为单位)。启动了计时器后,它将在向已注册侦听器触发第一个 ActionEvent 之前等待初始延迟。第一个事件之后,每次超过事件间延迟时它都继续触发事件,直到被停止。

构造之后,可以单独更改初始延迟和事件间延迟,并且可以添加其他 ActionListener

如果希望计时器只在第一次时触发然后停止,可以对计时器调用 setRepeats(false)

尽管所有 Timer 都使用一个共享线程(由第一个执行操作的 Timer 对象创建)执行等待,但是 Timer 的动作事件处理程序还会在其他线程(事件指派线程上)执行。这意味着 Timer 的操作处理程序可以安全地在 Swing 组件上执行操作。但是,它也意味着处理程序必须快速执行以保证 GUI 作出响应。

在 1.3 版本中,向 Java 平台添加了另一个 Timer 类:java.util.Timer。该类和 javax.swing.Timer 的基本功能相同,但是 java.util.Timer 更常用,功能更多。javax.swing.Timer 有两个特征,它们可以让使用 GUI 更方便。首先,其事件处理程序都是 GUI 程序员所熟悉的,并且可以更简单地处理事件指派线程。第二,其自动线程共享意味着不必采取特殊步骤来避免生成过多线程。相反,计时器使用同一个线程让光标闪烁、使工具提示显示等等。

通过查看 The Java Tutorial 中的 How to Use Timers 一节,可以找到使用计时器的更详细的文档和几个示例。有关在此 Timer 类和 java.util.Timer 之间进行选择的更多示例和帮助信息,请参阅 The Swing Connection 中的 Using Timers in Swing Applications 一文。

警告:此类的序列化对象与以后的 Swing 版本不兼容。当前序列化支持适用于短期存储,或适用于在运行相同 Swing 版本的应用程序之间进行 RMI(Remote Method Invocation,远程方法调用)。从 1.4 版本开始,已在 java.beans 包中添加了支持所有 JavaBeansTM 长期存储的功能。请参阅 XMLEncoder

另请参见:
java.util.Timer

从上面实例+解释可以很容易学会timer的调用。

看完上面的,也有了一个初步的了解,当注册一个timer对象以后,如果开发者令其start,那么这个定时器就会每隔设定的delay去调用开发者写的actionPerformed方法。也就是说,这个计时器本身就是一个线程,这个线程每隔一定时间去调用监听函数。利用这一性质,就可以很容易的写出这个计时器了。感觉自己在看文档的时候,遇到了一些问题,调用了timer类还在不停的想着用循环来实现这个秒表计时器的计时功能,背道而驰了,导致出现了一些列的资源占用等问题

。最后附上题目以及鄙人写的代码:

题目

实现代码如下:

 /*
* #MainFrame.java文档
*/ import javax.swing.*; public class MainFrame{
public static void main(String[] args){
JFrame frame = new JFrame("秒表");
frame.getContentPane().add(new Time());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.pack();
}
}
 /*
* #Time.java文档
*/
import java.awt.*;
import javax.swing.*;
import javax.swing.Timer;
import java.awt.event.*; public class Time extends JPanel implements ActionListener{
/**
* 反序列化
*/
private static final long serialVersionUID = 1L; //定义三个按钮
private JButton start, stop, reset; //定义一个标签用于显示
private JLabel label; //定义一个timer用于计时
private Timer timer; //flag变量,用于记录
private int flag = 0; //时间参数
private int hour = 0;
private int minute = 0;
private int second = 0; /*
* 构造方法,用于创建计时器对象
*/
public Time(){ setBackground(Color.LIGHT_GRAY);
setPreferredSize(new Dimension(800,600));
setLayout(null); //数字显示
label = new JLabel("00:00:00");
label.setBounds(240, 120, 400, 80);
label.setFont(new java.awt.Font("Dialog", 1, 72));
add(label); JPanel p1 = new JPanel();
p1.setBackground(Color.LIGHT_GRAY);
p1.setBounds(240, 240, 300, 60);
add(p1); start = new JButton("Start");
start.setFont(new Font("SAN_SERIF",Font.BOLD,24));
start.setBackground(Color.green);
stop = new JButton("Stop");
stop.setFont(new Font("SAN_SERIF",Font.BOLD,24));
stop.setBackground(Color.red);
reset = new JButton("Reset");
reset.setFont(new Font("SAN_SERIF",Font.BOLD,24));
reset.setBackground(Color.yellow); start.addActionListener(this);
stop.addActionListener(this);
reset.addActionListener(this); p1.add(start);
p1.add(stop);
p1.add(reset); timer = new Timer(1000, this);
timer.start();
} @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == reset){// 清除标签内容
timer.stop();
flag = 0;
label.setText(resetTime());
System.out.println(hour + ":" + minute + ":" + second);
}
else if(e.getSource() == start){
flag = 1;
label.setText(countTime());
System.out.println(hour + ":" + minute + ":" + second);
timer.restart();
}
else if(e.getSource() == stop){
timer.stop();
flag = 0;
label.setText(stopTime());
System.out.println(hour + ":" + minute + ":" + second);
}
else if(flag==1 && timer.isRunning()){
label.setText(countTime());
System.out.println(hour + ":" + minute + ":" + second);
}
else if(flag==0 && !timer.isRunning()){
label.setText(stopTime());
System.out.println(hour + ":" + minute + ":" + second);
} } /*
* 计时方法
*/
public String countTime(){
this.second += 1;
if(this.second == 60){
this.minute += 1;
this.second = 0;
}
if(this.minute == 60){
this.minute = 0;
this.hour += 1;
} String str = this.toString(this.hour, this.minute, this.second);
return str;
} /*
* 暂停计时方法
*/
public String stopTime(){
String str = this.toString(this.hour, this.minute, this.second);
return str;
} /*
* 重置计时方法
*/
public String resetTime(){
this.hour=0;
this.minute=0;
this.second=0;
String str = this.toString(this.hour, this.minute, this.second);
return str;
} /*
* 显示时间方法
*/
public String toString(int hour, int minute, int second){
String str1 = String.format("%02d", this.hour);
String str2 = String.format("%02d", this.minute);
String str3 = String.format("%02d", this.second);
return (str1 + ":" + str2 + ":" + str3);
} }

java swing中Timer类的学习的更多相关文章

  1. java中Timer类的详细介绍(详解)

    一.概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能,也就是在指定 ...

  2. C#中timer类的用法

    C#中timer类的用法 关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类 ...

  3. 关于C#中timer类

    ·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...

  4. 关于java中的类的学习

    设计模式应该牵扯到类的分布排列了,尽管现在我只能这么表达. 下面来自段帅发来的视频课程中的整理: 类与类之间的关系 每天进步一点点 类是java程序中最小组成单位,要理解后才可以更能理解类继承,重载, ...

  5. java中大数类的学习

    java中提供了大数类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类都在java.math.*包中,因此每次必须在开头处引用该包. 一.BigInteger构造函数: ...

  6. Java Swing 之Timer配合JProgressBar的使用

    Timer作为java开发中常用的一个定时工具,配合JProgressBar使用起来还真是方便,只需要调用timer.start()方法就能激活并运行,然后调用stop()方法便能停止,还可以再次通过 ...

  7. Java swing中的keyListener使用事例

    最近在学习Java swing,写了一个域内聊天室,实现用户登录ip,端口号之后,进入聊天窗口聊天: 通过菜单条增加了几个功能,边框,字体,颜色和文件传输.风格里的样式都可以通过自己选择来设置. 介绍 ...

  8. 关于Java源文件中public类的问题

    结论: 一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译: 如果源文件中没有一个public类,则文件名与类中没有一致性要求: 至于mai ...

  9. java swing 中JTable实现指定单元格为下拉框

    利用自定义的CellEditor实现第四列第二行为下拉框,本列其余行为文本框 利用默认的DefaultCellEditor设置第五列整列为下拉框   package mypackage; import ...

随机推荐

  1. 从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置

    从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置 char *msstrtok(char *instr, char *outstr, ch ...

  2. Oracle与Mysql区别简述

    在Mysql中,一个用户下可以创建多个库: 而在Oracle中,Oracle服务器是由两部分组成 数据库实例[理解为对象,看不见的] 数据库[理解为类,看得见的] 一个数据库实例可拥有多个用户,一个用 ...

  3. Hibernate关系映射之many-to-many

    1.建表 2.创建实体类及映射文件 Student.java类 public class Student implements java.io.Serializable { // Fields pri ...

  4. MySQL主从同步和读写分离的配置

    主服务器:192.168.1.126 从服务器:192.168.1.163 amoeba代理服务器:192.168.1.237 系统全部是CentOS 6.7 1.配置主从同步 1.1.修改主服务器( ...

  5. Huge Mission

    Huge Mission Problem Description Oaiei is busy working with his graduation design recently. If he ca ...

  6. Online Bayesian Probit Regression介绍之Factor Graph

    下面就开始讲讲概率图中的Factor Graph.概率图博大精深,非我等鼠辈能够完全掌握,我只是通过研究一些通用的模型,对概率图了解了一点皮毛.其实我只是从概率这头神兽身上盲人摸象地抓掉几根毛,我打算 ...

  7. Codeforces Round #420 (Div. 2)

    /*************************************************************************************************** ...

  8. Python一维数据分析

    1.Numpy数组 numpy的数组只能存放同一种数据类型,使用的方式和Python列表类似 1.1 声明: import numpy as np countries = np.array([ 'Af ...

  9. YYHS-Super Big Stupid Cross(二分+扫描线+平衡树)

    题目描述 “我是超级大沙茶”——Mato_No1 为了证明自己是一个超级大沙茶,Mato 神犇决定展示自己对叉(十字型)有多么的了 解. Mato 神犇有一个平面直角坐标系,上面有一些线段,保证这些线 ...

  10. 在项目中创建单元测试时junit的配置和使用

    首先配置项目中AndroidMainfest.xml文件,加入 <instrumentation android:name="android.test.InstrumentationT ...