zoukankan      html  css  js  c++  java
  • Java实现时间动态显示方法汇总

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

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

    1.方法一 用TimerTask:

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

    import java.awt.Dimension;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Timer;
    import java.util.TimerTask;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    /**
     * This class is a simple JFrame implementation to explain how to
     * display time dynamically on the JSwing-based interface.
     * @author Edison
     *
     */
    public class TimeFrame extends JFrame
    {
     /*
     * Variables 
     */
     private JPanel timePanel;
     private JLabel timeLabel;
     private JLabel displayArea;
     private String DEFAULT_TIME_FORMAT = "HH:mm:ss";
     private String time;
     private int ONE_SECOND = 1000;
      
     public TimeFrame()
     {
     timePanel = new JPanel();
     timeLabel = new JLabel("CurrentTime: ");
     displayArea = new JLabel();
      
     configTimeArea();
      
     timePanel.add(timeLabel);
     timePanel.add(displayArea);
     this.add(timePanel);
     this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     this.setSize(new Dimension(200,70));
     this.setLocationRelativeTo(null);
     }
      
     /**
     * This method creates a timer task to update the time per second
     */
     private void configTimeArea() {
     Timer tmr = new Timer();
     tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND);
     }
      
     /**
     * Timer task to update the time display area
     *
     */
     protected class JLabelTimerTask extends TimerTask{
     SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
     @Override
     public void run() {
      time = dateFormatter.format(Calendar.getInstance().getTime());
      displayArea.setText(time);
     }
     }
      
     public static void main(String arg[])
     {
     TimeFrame timeFrame=new TimeFrame();
     timeFrame.setVisible(true); 
     } 
    }/* 何问起 hovertree.com */

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

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

    import java.awt.Dimension;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    /**
     * This class is a simple JFrame implementation to explain how to
     * display time dynamically on the JSwing-based interface.
     * @author Edison
     *
     */
    public class DTimeFrame2 extends JFrame implements Runnable{
     private JFrame frame;
     private JPanel timePanel;
     private JLabel timeLabel;
     private JLabel displayArea;
     private String DEFAULT_TIME_FORMAT = "HH:mm:ss";
     private int ONE_SECOND = 1000;
      
     public DTimeFrame2()
     {
     timePanel = new JPanel();
     timeLabel = new JLabel("CurrentTime: ");
     displayArea = new JLabel();
      
     timePanel.add(timeLabel);
     timePanel.add(displayArea);
     this.add(timePanel);
     this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     this.setSize(new Dimension(200,70));
     this.setLocationRelativeTo(null);
     }
     public void run()
     {
     while(true)
     {
      SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT);
      displayArea.setText(dateFormatter.format(
         Calendar.getInstance().getTime()));
      try
      {
      Thread.sleep(ONE_SECOND); 
      }
      catch(Exception e)
      {
      displayArea.setText("Error!!!");
      }
     } 
     } 
      
     public static void main(String arg[])
     {
     DTimeFrame2 df2=new DTimeFrame2();
     df2.setVisible(true);
      
     Thread thread1=new Thread(df2);
     thread1.start(); 
     } 
    }
    /* hwq2.com */

    比较:

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

    注意如下代码:

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

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

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Locale;
    import java.util.TimeZone;
    import java.util.Timer;
    import java.util.TimerTask;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    /**
     * A simple world clock
     * @author Edison
     *
     */
    public class WorldTimeFrame extends JFrame
    {
     /**
     * 
     */
     private static final long serialVersionUID = 4782486524987801209L;
      
     private String time;
     private JPanel timePanel;
     private TimeZone timeZone;
     private JComboBox zoneBox;
     private JLabel displayArea;
      
     private int ONE_SECOND = 1000;
     private String DEFAULT_FORMAT = "EEE d MMM, HH:mm:ss";
      
     public WorldTimeFrame()
     {
     zoneBox = new JComboBox();
     timePanel = new JPanel();
     displayArea = new JLabel();
     timeZone = TimeZone.getDefault();
      
     zoneBox.setModel(new DefaultComboBoxModel(TimeZone.getAvailableIDs()));
      
     zoneBox.addActionListener(new ActionListener(){
      @Override
      public void actionPerformed(ActionEvent e) {
      updateTimeZone(TimeZone.getTimeZone((String) zoneBox.getSelectedItem()));
      }
       
     });
      
     configTimeArea();
      
     timePanel.add(displayArea);
     this.setLayout(new BorderLayout());
     this.add(zoneBox, BorderLayout.NORTH);
     this.add(timePanel, BorderLayout.CENTER);
     this.setLocationRelativeTo(null);
     this.setDefaultCloseOperation(EXIT_ON_CLOSE);
     this.setVisible(true);
     pack();
     }
      
     /**
     * This method creates a timer task to update the time per second
     */
     private void configTimeArea() {
     Timer tmr = new Timer();
     tmr.scheduleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND);
     }
      
     /**
     * Timer task to update the time display area
     *
     */
     public class JLabelTimerTask extends TimerTask{
     SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, Locale.ENGLISH);
     @Override
     public void run() {
      dateFormatter.setTimeZone(timeZone);
      time = dateFormatter.format(Calendar.getInstance().getTime());
      displayArea.setText(time);
     }
     }
      
     /**
     * Update the timeZone
     * @param newZone
     */
     public void updateTimeZone(TimeZone newZone)
     {
     this.timeZone = newZone;
     }
      
     public static void main(String arg[])
     {
     new WorldTimeFrame();
     } 
    }/* 何问起 hovertree.com */

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

    补充:

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

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

  • 相关阅读:
    番茄工作法
    Linux命令学习chroot和chmode
    ejabberd与XMPP
    【转载】Understanding When to use RabbitMQ or Apache Kafka
    Activiti的ACT_GE_PROPERTY表初始化
    Spring transaction与EJB transaction的关系
    mysql & java & spring transaction isolation level
    Drools解决积分问题
    Rendertron:谷歌 Chrome 新的 headless 模式又贡献了一个新的技巧
    LDAP的前世今生
  • 原文地址:https://www.cnblogs.com/roucheng/p/javadongtai.html
Copyright © 2011-2022 走看看