java swing中Timer类的学习
最近在完成学校课程的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类的学习的更多相关文章
- java中Timer类的详细介绍(详解)
一.概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能,也就是在指定 ...
- C#中timer类的用法
C#中timer类的用法 关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类 ...
- 关于C#中timer类
·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...
- 关于java中的类的学习
设计模式应该牵扯到类的分布排列了,尽管现在我只能这么表达. 下面来自段帅发来的视频课程中的整理: 类与类之间的关系 每天进步一点点 类是java程序中最小组成单位,要理解后才可以更能理解类继承,重载, ...
- java中大数类的学习
java中提供了大数类BigInteger和BigDecimal分别表示大整数类和大浮点数类,这两个类都在java.math.*包中,因此每次必须在开头处引用该包. 一.BigInteger构造函数: ...
- Java Swing 之Timer配合JProgressBar的使用
Timer作为java开发中常用的一个定时工具,配合JProgressBar使用起来还真是方便,只需要调用timer.start()方法就能激活并运行,然后调用stop()方法便能停止,还可以再次通过 ...
- Java swing中的keyListener使用事例
最近在学习Java swing,写了一个域内聊天室,实现用户登录ip,端口号之后,进入聊天窗口聊天: 通过菜单条增加了几个功能,边框,字体,颜色和文件传输.风格里的样式都可以通过自己选择来设置. 介绍 ...
- 关于Java源文件中public类的问题
结论: 一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译: 如果源文件中没有一个public类,则文件名与类中没有一致性要求: 至于mai ...
- java swing 中JTable实现指定单元格为下拉框
利用自定义的CellEditor实现第四列第二行为下拉框,本列其余行为文本框 利用默认的DefaultCellEditor设置第五列整列为下拉框 package mypackage; import ...
随机推荐
- javascript面向对象编程笔记
对象:一切事物皆是对象.对象是一个整体,对外提供一些操作.比如说一个收音机是一个对象,我们不需要知道它的内部结构是什么,只需要会使用外部的按钮就可以使用收音机. 面向对象:面向对象语言的标志是他们都有 ...
- python基础之字典、赋值补充
字典常用操作: 存/取info_dic={'name':'egon','age':18,'sex':'male'} print(info_dic['name11111111']) print(info ...
- org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably du
如果出现类似下面的错误,原因就是JDK版本太高了,我换成1.7就没事了 Caused by: org.springframework.core.NestedIOException: ASM Class ...
- Servlet第三篇【request和response简介、response的常见应用】
response.request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象.和代表响应的response对象 既然request对象代表ht ...
- java面试之Hashmap
在java面试中hashMap应该说一个必考的题目,而且HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接 ...
- 浅谈IT技术女转战微电商初体验
今天闲来无事,突然想翻看下之前写的技术博客,很是意外,居然那么多阅读量,于是想想做微商也有一段时间了,决定写写初入微商的初体验. 先自我介绍一下,本人是一名理工女,做IT行业的,这个行业也许有人了解, ...
- 只用一招让你Maven依赖下载速度快如闪电
一.背景 众所周知,Maven对于依赖的管理让我们程序员感觉爽的不要不要的,但是由于这货是国外出的,所以在我们从中央仓库下载依赖的时候,速度如蜗牛一般,让人不能忍,并且这也是大多数程序员都会遇到的问题 ...
- vmware三种网络格式
网络地址转换(NAT) 这种访问模式指的是虚拟机不占用主机所在局域网的ip,通过使用主机的NAT功能访问局域网和互联网,意味着虚拟机可以访问局域网中的其他电脑,但是其他电脑不知道虚拟机的存在. 使用这 ...
- openlayer的凸包算法实现
最近在要实现一个openlayer的凸多边形,也遇到了不小的坑,就记录一下 1.具体的需求: 通过在界面点击,获取点击是的坐标点,来绘制一个凸多边形. 2.思考过程: 1)首先,我们得先获取点击事件发 ...
- React——组件的生命周期函数
每一个组件都有一些生命周期函数. 当组件实例被创建并且会插入到DOM中,下面这些函数会被调用 constructor componentWillMount render componentDidMou ...