`
thinkingmt
  • 浏览: 24853 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

About"Timer" & "Calendar"

阅读更多

这个星期做了一个简单的计时器,这个计时器可以获得当前的系统时间,并计时。

 

主要用到了java.util.Calendar 和 java.util.Timer 这两个类,这两个类非常实用,计时器这个程序也可以应用的很广,比如很多游戏需要计时(扫雷),测试也需要计时。

 

第一个类代码如下:

 

/**
 * The NumberDisplay class represents a digital number display that can hold
 * values from zero to a given limit. The limit can be specified when creating
 * the display. The values range from zero (inclusive) to limit-1. If used,
 * for example, for the seconds on a digital clock, the limit would be 60, 
 * resulting in display values from 0 to 59. When incremented, the display 
 * automatically rolls over to zero when reaching the limit.
 * 
 * @author Michael Kolling and David J. Barnes
 * @version 2006.03.30
 */
public class NumberDisplay
{
    private int limit;
    private int value;

    /**
     * Constructor for objects of class NumberDisplay.
     * Set the limit at which the display rolls over.
     */
    public NumberDisplay(int rollOverLimit)
    {
        limit = rollOverLimit;
        value = 0;
    }

    /**
     * Return the current value.
     */
    public int getValue()
    {
        return value;
    }

    /**
     * Return the display value (that is, the current value as a two-digit
     * String. If the value is less than ten, it will be padded with a leading
     * zero).
     */
    public String getDisplayValue()
    {
        if(value < 10) {
            return "0" + value;
        }
        else {
            return "" + value;
        }
    }

    /**
     * Set the value of the display to the new specified value. If the new
     * value is less than zero or over the limit, do nothing.
     */
    public void setValue(int replacementValue)
    {
        if((replacementValue >= 0) && (replacementValue < limit)) {
            value = replacementValue;
        }
    }

    /**
     * Increment the display value by one, rolling over to zero if the
     * limit is reached.
     */
    public void increment()
    {
        value = (value + 1) % limit;
    }
}

 

 

这个类中,对于我来说比较难想到的是 increment()这个方法,value = (value + 1) % limit; 能够很好的利用limit(区间)去判断时间是否需要进为0。

 

另外一个类:

 

import java.util.Calendar;
/**
 * The ClockDisplay class implements a digital clock display for a
 * European-style 24 hour clock. The clock shows hours and minutes. The 
 * range of the clock is 00:00 (midnight) to 23:59 (one minute before 
 * midnight).
 * 
 * The clock display receives "ticks" (via the timeTick method) every minute
 * and reacts by incrementing the display. This is done in the usual clock
 * fashion: the hour increments when the minutes roll over to zero.
 * 
 * @author Michael Kolling and David J. Barnes
 * @version 2006.03.30
 */
public class ClockDisplay
{
    private NumberDisplay hours;
    private NumberDisplay minutes;
    private NumberDisplay seconds;
    private String displayString;    // simulates the actual display
    
    /**
     * Constructor for ClockDisplay objects. This constructor 
     * creates a new clock set at 00:00.
     */
    public ClockDisplay()
    {
        hours = new NumberDisplay(24);
        minutes = new NumberDisplay(60);
        seconds = new NumberDisplay(60);
        updateDisplay();
    }

    /**
     * Constructor for ClockDisplay objects. This constructor
     * creates a new clock set at the time specified by the 
     * parameters.
     */
    public ClockDisplay(int hour, int minute,int second)
    {
        hours = new NumberDisplay(24);
        minutes = new NumberDisplay(60);
        seconds = new NumberDisplay(60);
        setTime(hour, minute, second);
    }

    /**
     * This method should get called once every minute - it makes
     * the clock display go one minute forward.
     */
    public void timeTick()
    {
        seconds.increment();
        if(seconds.getValue()==0)
        {
            minutes.increment();
        if(minutes.getValue() == 0) 
        {// it just rolled over!
            hours.increment();
        }
        }
         updateDisplay();
    }

    /**
     * Set the time of the display to the specified hour and
     * minute.
     */
    public void setTime(int hour, int minute, int second)
    {
        hours.setValue(hour);
        minutes.setValue(minute);
        seconds.setValue(second);
        updateDisplay();
    }

    /**
     * Return the current time of this display in the format HH:MM.
     */
    public String getTime()
    {
        return displayString;
    }
    
    /**
     * Update the internal string that represents the display.
     */
    private void updateDisplay()
    {
        displayString = hours.getDisplayValue() + ":" + 
                        minutes.getDisplayValue()+":"+seconds.getDisplayValue();
    }
    
    public void getCurrentTime()
    {
        Calendar rightNow = Calendar.getInstance();
        int hour=rightNow.get(Calendar.HOUR_OF_DAY);
        int minute=rightNow.get(Calendar.MINUTE);
        int second=rightNow.get(Calendar.SECOND);
        
        setTime(hour,minute,second);
    }
}

 

这个类中运用了Calendar的对象rightNow来获得当前系统时间。

 

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

 

与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。CalendargetInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:

     Calendar rightNow = Calendar.getInstance();

 

 

还有最后一个gui的类:

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class ShowTime extends JFrame
{
    private JButton start = new JButton("Start");
    private JButton stop = new JButton("Stop");
    private JLabel show= new JLabel();
    private ClockDisplay ck= new ClockDisplay();
    private java.util.Timer time;
    
    public ShowTime()
    {
        makeFrame();
        makeFunction();
    }
    
    private void makeFrame()
    {
        Container con= getContentPane();
        con.setLayout(new BorderLayout());
        
        JPanel center= new JPanel();
        center.add(show);
        con.add(center,BorderLayout.CENTER);
        ck.getCurrentTime();
        show.setText(ck.getTime());
        
        JPanel south= new JPanel();
        south.setLayout(new FlowLayout());
        south.add(start);
        south.add(stop);
        con.add(south,BorderLayout.SOUTH);
        
        setSize(300,200);
        setVisible(true);
    }
    
    private void makeFunction()
    {
        start.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e)
            {
                if(time ==null)
                {
                    time = new java.util.Timer();
                    time.schedule(new MyTimerTask(),1000,1000);
                }
               
            }
        });
        
       stop.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent e)
            {
                if(time!=null)
                {
                    time.cancel();
                    time=null;
                }
            }
        });
    }
    
    private class MyTimerTask extends TimerTask
    {
        public void run()
        {
            ck.timeTick();
            show.setText(ck.getTime());
        }
    }
}

 

 

Timer:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

 

 void schedule(TimerTask task, long delay, long period)
          安排指定的任务从指定的延迟后开始进行重复的固定延迟执行

 

TimerTask是一个抽象类,所以需要自己写一个TimerTask的子类:MyTimerTask,其中run()是抽象的,所以这个方法需要重写,这个方法中运行的,也就是我们所期望的重复地按固定延迟推进时间,其实也就是:每隔一秒钟,执行以下代码:

 

ck.timeTick();//ck是ClockDisplay的对象。
show.setText(ck.getTime());

 

 

运行效果如下:

 

 

与系统时间: 是一致的。

 

但在初期,Start的actionPerformed()中如果不对time进行判断,会造成连续点击Start计时加速的问题,而且不能通过点击相同次数的Stop来停止。

 

利用JButton的setEnabled(boolean b)来对Start,Stop的点击进行限制而避免此问题,或者:如我的代码中一样,通过if的判断来保证只有一个time在执行任务(这不是singleton)。

 

 

分享到:
评论

相关推荐

    解析Date & Calendar类

    【解析Date & Calendar类】 Java中的Date和Calendar类是处理日期和时间的核心工具。这两个类在Java编程中扮演着重要角色,特别是在处理日期计算、格式化以及与数据库交互时。 1. **java.util.Date** - **字符串转...

    java SimpleDateFormat &Calendar

    在Java编程语言中,`SimpleDateFormat`和`Calendar`是两个重要的日期和时间处理类,它们在处理日期格式化、解析以及日期计算方面扮演着重要角色。本文将深入探讨这两个类的功能、用法以及它们之间的关系。 `...

    ChipKit RealTime Clock & Calendar:ChipKit板上的实时时钟和日历库-开源

    标题中的“ChipKit RealTime Clock & Calendar”是一个专为ChipKit开发板设计的实时时钟和日历功能库。这个库使得用户能够轻松地在基于Microchip PIC32微控制器的ChipKit UNO32和MAX32开发板上实现精确的时间管理...

    Java 之 Date 和 Calendar 实例

    在Java编程语言中,`Date`和`Calendar`类是处理日期和时间的核心组件。这两个类在不同的Java版本中有着不同的使用方式和功能,对于理解Java时间处理机制至关重要。本篇将深入探讨`Date`和`Calendar`类的实例应用。 ...

    linkchat屏幕分享和日历插件「linkchat Screen Sharing & Calendar Add-on」-crx插件

    它支持Microsoft Outlook,Google Calendar,Apple Calendar和Yahoo Mail的在线和离线版本。 使用屏幕共享来显示演示文稿,与其他人共享文档或共享网页。你会注意到,你将能够更快更轻松地交流你想要的东西以及对你...

    simplecalendar.js记录事件的日历插件

    《深入解析simplecalendar.js:构建记录事件的日历插件》 在现代网页设计中,日历插件已经成为不可或缺的一部分,它能帮助用户直观地管理时间安排和事件记录。"simplecalendar.js"是一款轻量级、易用且功能丰富的...

    日历日程表联动layui&amp;tui.calendar

    layui 和 tui.calendar 资源, 内含layui日历联动tui.calendar日程表(日、周、月)实例 相关文档: https://nhn.github.io/tui.calendar/latest/Calendar#setCalendars ...

    简易日历 Calendar Control 8.0

    《简易日历Calendar Control 8.0:ActiveX技术在日历应用中的深度解析》 在信息技术领域,ActiveX控件是一种广泛应用于Windows操作系统上的组件技术,它允许开发者创建交互式且可重用的用户界面元素。其中,“简易...

    漂亮的jQuery事件日历插件calendar.js

    **jQuery事件日历插件calendar.js详解** 在网页设计中,日历插件是一个非常实用的元素,尤其在处理日期相关的交互时。"漂亮的jQuery事件日历插件calendar.js"正是这样一个工具,它能帮助开发者轻松地在网页上集成...

    Calendar日期代码详解

    根据提供的文件信息,本文将对Java中的`Calendar`类进行详细的解析,并且通过示例代码进一步阐述其在日期与时间处理中的应用。 ### Calendar日期代码详解 #### 1. Calendar 类简介 `java.util.Calendar` 类是 ...

    ASP.NET Calendar如何给每天添加日志

    ASP.NET Calendar日志添加方法 ASP.NET Calendar控件是ASP.NET中常用的日历控件,用于显示日期和事件信息。然而,在实际应用中,我们经常需要对每天添加日志信息,以便更好地记录和管理事件。本文将详细介绍如何...

    JAVA LunarCalendar返回农历(阴历)日期 JAR包 有包括详细DOC文档

    LunarCalendar返回农历(阴历)日期的JAR包 根据指定日期计算对应农历日期(这个计算方法是网上找的,最初的作者是谁已经无法考证了,感谢网络资源吧!),本人封装成好用的JAR包后发不出来,供大家免费下载! ...

    Android 使用Calendar获取时间信息

    在Android开发中,`Calendar`类是用于处理日期和时间的核心工具之一。它是一个抽象类,提供了各种操作日期和时间的方法。在这个项目中,我们将会深入探讨如何使用`Calendar`来获取年、月、日、时、分以及秒等时间...

    Active Desktop Calendar 7.95 简体中文汉化补丁

    《Active Desktop Calendar 7.95 简体中文汉化补丁详解及应用》 Active Desktop Calendar是一款功能强大的桌面日历软件,以其便捷性和实用性深受用户喜爱。然而,对于中文用户来说,英文界面可能会带来一定的操作...

    jscalendar-1.0

    &lt;script type=\"text/javascript\" src=\"&lt;%=ctx%&gt;/js/calendar/calendar.js\"&gt; &lt;script type=\"text/javascript\" src=\"&lt;%=ctx%&gt;/js/calendar/calendar-zh.js\"&gt; ...

    PyPI 官网下载 | LunarCalendar-0.0.9.tar.gz

    《PyPI官网下载 | LunarCalendar-0.0.9.tar.gz——深入了解Python农历库》 在Python的世界里,丰富的第三方库是其强大功能的重要组成部分。本文将深入探讨一个名为"LunarCalendar"的Python库,该库可以从PyPI...

    java的calendar具体用法

    ### Java中的Calendar类详解 #### 一、引言 在Java中处理日期和时间非常常见,而`java.util.Calendar`类则是进行此类操作的核心工具之一。`Calendar`类提供了一系列的功能来帮助开发者处理复杂的日期计算问题,...

    java 中Calendar日期格式的转换

    在Java编程语言中,`Calendar`类是处理日期和时间的核心工具之一,它提供了一种可以操作日期和时间字段(如年、月、日、时、分、秒等)的灵活方式。`Calendar`类是抽象的,因此我们通常通过其子类如`...

    Calendar和Date的转化

    ### Calendar和Date的转化 在Java编程语言中,`Calendar`和`Date`是处理日期和时间的重要类。为了更好地理解和使用这两个类之间的转换方法,本文将详细介绍如何将`Calendar`对象转换为`Date`对象,以及如何将`Date`...

    基于Vue2-Calendar改进的日历组件(含中文使用说明)

    本文将详细介绍一个基于Vue2-Calendar组件进行改进的日历组件,该组件在原版基础上进行了多项优化,以满足更多样化的使用需求。首先,让我们了解一下Vue2-Calendar的基础知识。 Vue2-Calendar是一款适用于Vue.js...

Global site tag (gtag.js) - Google Analytics