这篇文章主要介绍了Java实现时间动态显示方法汇总,很实用的功能,需要的朋友可以参考下

本文所述实例可以实现Java在界面上动态的显示时间。具体实现方法汇总如下:

1.方法一 用TimerTask:

利用java.util.Timer和java.util.TimerTask来做动态更新,毕竟每次更新可以看作是计时1秒发生一次。
代码如下:

  1. import java.awt.Dimension;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Calendar;
  4. import java.util.Date;
  5. import java.util.Timer;
  6. import java.util.TimerTask;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. import javax.swing.JPanel;
  10. /**
  11. * This class is a simple JFrame implementation to explain how to
  12. * display time dynamically on the JSwing-based interface.
  13. * @author Edison
  14. *
  15. */
  16. public class TimeFrame extends JFrame
  17. {
  18. /*
  19. * Variables
  20. */
  21. private JPanel timePanel;
  22. private JLabel timeLabel;
  23. private JLabel displayArea;
  24. private String DEFAULT_TIME_FORMAT = "HH:mm:ss";
  25. private String time;
  26. private int ONE_SECOND = 1000;
  27.  
  28. public TimeFrame()
  29. {
  30. timePanel = new JPanel();
  31. timeLabel = new JLabel("CurrentTime: ");
  32. displayArea = new JLabel();
  33.  
  34. configTimeArea();
  35.  
  36. timePanel.add(timeLabel);
  37. timePanel.add(displayArea);
  38. this.add(timePanel);
  39. this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  40. this.setSize(new Dimension(200,70));
  41. this.setLocationRelativeTo(null);
  42. }
  43.  
  44. /**
  45. * This method creates a timer task to update the time per second
  46. */
  47. private void configTimeArea() {
  48. Timer tmr = new Timer();
  49. tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND);
  50. }
  51.  
  52. /**
  53. * Timer task to update the time display area
  54. *
  55. */
  56. protected class JLabelTimerTask extends TimerTask{
  57. SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
  58. @Override
  59. public void run() {
  60. time = dateFormatter.format(Calendar.getInstance().getTime());
  61. displayArea.setText(time);
  62. }
  63. }
  64.  
  65. public static void main(String arg[])
  66. {
  67. TimeFrame timeFrame=new TimeFrame();
  68. timeFrame.setVisible(true);
  69. }
  70. }/* 何问起 hovertree.com */

继承TimerTask来创建一个自定义的task,获取当前时间,更新displayArea.
然后创建一个timer的实例,每1秒执行一次timertask。由于用schedule可能会有时间误差产生,所以直接调用精度更高的scheduleAtFixedRate的。
 
2. 方法二:利用线程:

这个就比较简单了。具体代码如下:

  1. import java.awt.Dimension;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Calendar;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JPanel;
  7. /**
  8. * This class is a simple JFrame implementation to explain how to
  9. * display time dynamically on the JSwing-based interface.
  10. * @author Edison
  11. *
  12. */
  13. public class DTimeFrame2 extends JFrame implements Runnable{
  14. private JFrame frame;
  15. private JPanel timePanel;
  16. private JLabel timeLabel;
  17. private JLabel displayArea;
  18. private String DEFAULT_TIME_FORMAT = "HH:mm:ss";
  19. private int ONE_SECOND = 1000;
  20.  
  21. public DTimeFrame2()
  22. {
  23. timePanel = new JPanel();
  24. timeLabel = new JLabel("CurrentTime: ");
  25. displayArea = new JLabel();
  26.  
  27. timePanel.add(timeLabel);
  28. timePanel.add(displayArea);
  29. this.add(timePanel);
  30. this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  31. this.setSize(new Dimension(200,70));
  32. this.setLocationRelativeTo(null);
  33. }
  34. public void run()
  35. {
  36. while(true)
  37. {
  38. SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
  39. displayArea.setText(dateFormatter.format(
  40. Calendar.getInstance().getTime()));
  41. try
  42. {
  43. Thread.sleep(ONE_SECOND);
  44. }
  45. catch(Exception e)
  46. {
  47. displayArea.setText("Error!!!");
  48. }
  49. }
  50. }
  51.  
  52. public static void main(String arg[])
  53. {
  54. DTimeFrame2 df2=new DTimeFrame2();
  55. df2.setVisible(true);
  56.  
  57. Thread thread1=new Thread(df2);
  58. thread1.start();
  59. }
  60. }
  61. /* hwq2.com */

比较:

个人倾向于方法一,因为Timer是可以被多个TimerTask共用,而产生一个线程,会增加多线程的维护复杂度。

注意如下代码:

  1. jFrame.setDefaultCloseOperation(); // 给关闭按钮增加特定行为
  2. jFrame.setLocationRelativeTo(null); // 让Frame一出来就在屏幕中间,而不是左上方。

将上面方法一稍微一修改,就可以显示多国时间。代码如下:

  1. import java.awt.BorderLayout;
  2. import java.awt.event.ActionEvent;
  3. import java.awt.event.ActionListener;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Calendar;
  6. import java.util.Date;
  7. import java.util.Locale;
  8. import java.util.TimeZone;
  9. import java.util.Timer;
  10. import java.util.TimerTask;
  11. import javax.swing.DefaultComboBoxModel;
  12. import javax.swing.JComboBox;
  13. import javax.swing.JFrame;
  14. import javax.swing.JLabel;
  15. import javax.swing.JPanel;
  16. /**
  17. * A simple world clock
  18. * @author Edison
  19. *
  20. */
  21. public class WorldTimeFrame extends JFrame
  22. {
  23. /**
  24. *
  25. */
  26. private static final long serialVersionUID = 4782486524987801209L;
  27.  
  28. private String time;
  29. private JPanel timePanel;
  30. private TimeZone timeZone;
  31. private JComboBox zoneBox;
  32. private JLabel displayArea;
  33.  
  34. private int ONE_SECOND = 1000;
  35. private String DEFAULT_FORMAT = "EEE d MMM, HH:mm:ss";
  36.  
  37. public WorldTimeFrame()
  38. {
  39. zoneBox = new JComboBox();
  40. timePanel = new JPanel();
  41. displayArea = new JLabel();
  42. timeZone = TimeZone.getDefault();
  43.  
  44. zoneBox.setModel(new DefaultComboBoxModel(TimeZone.getAvailableIDs()));
  45.  
  46. zoneBox.addActionListener(new ActionListener(){
  47. @Override
  48. public void actionPerformed(ActionEvent e) {
  49. updateTimeZone(TimeZone.getTimeZone((String) zoneBox.getSelectedItem()));
  50. }
  51.  
  52. });
  53.  
  54. configTimeArea();
  55.  
  56. timePanel.add(displayArea);
  57. this.setLayout(new BorderLayout());
  58. this.add(zoneBox, BorderLayout.NORTH);
  59. this.add(timePanel, BorderLayout.CENTER);
  60. this.setLocationRelativeTo(null);
  61. this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  62. this.setVisible(true);
  63. pack();
  64. }
  65.  
  66. /**
  67. * This method creates a timer task to update the time per second
  68. */
  69. private void configTimeArea() {
  70. Timer tmr = new Timer();
  71. tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND);
  72. }
  73.  
  74. /**
  75. * Timer task to update the time display area
  76. *
  77. */
  78. public class JLabelTimerTask extends TimerTask{
  79. SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, Locale.ENGLISH);
  80. @Override
  81. public void run() {
  82. dateFormatter.setTimeZone(timeZone);
  83. time = dateFormatter.format(Calendar.getInstance().getTime());
  84. displayArea.setText(time);
  85. }
  86. }
  87.  
  88. /**
  89. * Update the timeZone
  90. * @param newZone
  91. */
  92. public void updateTimeZone(TimeZone newZone)
  93. {
  94. this.timeZone = newZone;
  95. }
  96.  
  97. public static void main(String arg[])
  98. {
  99. new WorldTimeFrame();
  100. }
  101. }/* 何问起 hovertree.com */

本来需要在updateTimeZone(TimeZone newZone)中,更新displayArea的。但是考虑到TimerTask执行的时间太短,才1秒钟,以肉眼观察,基本上是和立刻更新没区别。如果TimerTask执行时间长的话,这里就要立刻重新用心的时间更新一下displayArea。

补充:

①. pack() 用来自动计算屏幕大小;
②. TimeZone.getAvailableIDs() 用来获取所有的TimeZone。

推荐:http://www.cnblogs.com/roucheng/p/3504465.html

Java实现时间动态显示方法汇总的更多相关文章

  1. Python实用日期时间处理方法汇总

    这篇文章主要介绍了Python实用日期时间处理方法汇总,本文讲解了获取当前datetime.获取当天date.获取明天/前N天.获取当天开始和结束时间(00:00:00 23:59:59).获取两个d ...

  2. java比较时间的方法

    一.通过compareTo Date date = new Date(1576118709574L); Date date1 = new Date(1576118709574L); Date date ...

  3. java中文乱码解决方法汇总

    public static void main(String[] argv){ try {                 System.out.println(“中文”);//1           ...

  4. java中获取日期和时间的方法总结

    1.获取当前时间,和某个时间进行比较.此时主要拿long型的时间值. 方法如下:  要使用 java.util.Date .获取当前时间的代码如下 Date date = new Date(); da ...

  5. OpenCV3 Java 机器学习使用方法汇总

    原文链接:OpenCV3 Java 机器学习使用方法汇总  前言 按道理来说,C++版本的OpenCV训练的版本XML文件,在java中可以无缝使用.但要注意OpenCV本身的版本问题.从2.4 到3 ...

  6. Java向mysql中插入时间的方法

    ava向MySQL插入当前时间的四种方式和java时间日期格式化的几种方法(案例说明);部分资料参考网络资源  java向MySQL插入当前时间的四种方式 第一种:将java.util.Date类型的 ...

  7. Java快速入门-03-小知识汇总篇(全)

    Java快速入门-03-小知识汇总篇(全) 前两篇介绍了JAVA入门的一系小知识,本篇介绍一些比较偏的,说不定什么时候会用到,有用记得 Mark 一下 快键键 常用快捷键(熟记) 快捷键 快捷键作用 ...

  8. 最常见的Java面试题及答案汇总(三)

    上一篇:最常见的Java面试题及答案汇总(二) 多线程 35. 并行和并发有什么区别? 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生. 并行是在不同实体上的多个事 ...

  9. java 多线程40个问题汇总(转)

    java 多线程40个问题汇总,自己也记录一份,如有侵权,联系删除 ref from :http://www.cnblogs.com/xrq730/p/5060921.html 1.多线程作用 - 利 ...

随机推荐

  1. Android编译过程中的碎碎念

    刷机不是用rom包吗?怎么可以使用fastboot flashall -w将*.img文件刷入呢? 在Mac上面可以参考这篇文章进行刷机.概括来说解释从官方下载rom包,解压后运行./flash-al ...

  2. 搭建 SVN 服务器

    安装.启动 SVN 服务器 在 Windows 下,可以使用以下命令将 SVN 服务注册到 windows 服务中去: sc create svnserver binPath= "drive ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (42) ------ 第八章 POCO之使用POCO

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第八章 POCO 对象不应该知道如何保存它们,加载它们或者过滤它们.这是软件开发中熟 ...

  4. 通过圆形载入View了解自定义View

    这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...

  5. 微信小程序客服消息使用指南

    客服消息使用指南 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. 功能介绍 用户可使用小程序客服消息功能,与小程序的客服人 ...

  6. atom-shell程序打包

    上一篇:http://www.cnblogs.com/luobenCode/p/4504910.html 打包之前要准备一下 请看这篇http://www.cnblogs.com/seanlv/arc ...

  7. Drupal8重命名上传的中文名文件

    完整的模块代码文件在Coding.net上,想直接使用的请前往下载:https://coding.net/u/yamus/p/chinese_rename/git/tree/master 最近吧Dru ...

  8. iOS-App发布证书的申请与使用

    i开发环境:xcode5.1.1 iphonesdk:7.1 开发机器:iMac 真机部署测试:apple个人开发者ID 向导: 必备IDP证书和distribution证书(第一个证书是真机部署测试 ...

  9. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  10. OpenCASCADE Rational Bezier Curves

    OpenCASCADE Rational Bezier Curves eryar@163.com Abstract. Although polynomials offer many advantage ...