Java中如何实现显示动态的时间
来源:才华咖 本文已影响3.6K人
来源:才华咖 本文已影响3.6K人
本文所述实例可以实现Java在界面上动态的显示时间。具体实现方法汇总如下:
1.方法一 用TimerTask:
利用r和rTask来做动态更新,毕竟每次更新可以看作是计时1秒发生一次。
代码如下:
import nsion;import leDateFormat;import ndar;import ;import r;import rTask;import me;import el;import el;/** * 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(); (timeLabel); (displayArea); (timePanel); efaultCloseOperation(EXIT_ON_CLOSE); ize(new Dimension(200,70)); ocationRelativeTo(null); } /** * This method creates a timer task to the time per second */ private void configTimeArea() { Timer tmr = new Timer(); duleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND); } /** * Timer task to the time display area * */ protected class JLabelTimerTask extends TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); @Override public void run() { time = at(nstance()ime()); ext(time); } } public static void main(String arg[]) { TimeFrame timeFrame=new TimeFrame(); isible(true); } }
继承TimerTask来创建一个自定义的task,获取当前时间,更新displayArea.
然后创建一个timer的实例,每1秒执行一次timertask。由于用schedule可能会有时间误差产生,所以直接调用精度更高的scheduleAtFixedRate的。
2. 方法二:利用线程:
这个就比较简单了。具体代码如下:
import nsion;import leDateFormat;import ndar;import me;import el;import el;/** * 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(); (timeLabel); (displayArea); (timePanel); efaultCloseOperation(EXIT_ON_CLOSE); ize(new Dimension(200,70)); ocationRelativeTo(null); } public void run() { while(true) { SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_TIME_FORMAT); ext(at( nstance()ime())); try { p(ONE_SECOND); } catch(Exception e) { ext("Error!!!"); } } } public static void main(String arg[]) { DTimeFrame2 df2=new DTimeFrame2(); isible(true); Thread thread1=new Thread(df2); t(); } }
比较:
个人倾向于方法一,因为Timer是可以被多个TimerTask共用,而产生一个线程,会增加多线程的维护复杂度。
注意如下代码:
efaultCloseOperation(); // 给关闭按钮增加特定行为ocationRelativeTo(null); // 让Frame一出来就在屏幕中间,而不是左上方。
将上面方法一稍微一修改,就可以显示多国时间。代码如下:
import erLayout;import onEvent;import onListener;import leDateFormat;import ndar;import ;import le;import Zone;import r;import rTask;import ultComboBoxModel;import boBox;import me;import el;import el;/** * 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 = efault(); odel(new DefaultComboBoxModel(vailableIDs())); ctionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { updateTimeZone(imeZone((String) electedItem())); } }); configTimeArea(); (displayArea); ayout(new BorderLayout()); (zoneBox, H); (timePanel, ER); ocationRelativeTo(null); efaultCloseOperation(EXIT_ON_CLOSE); isible(true); pack(); } /** * This method creates a timer task to the time per second */ private void configTimeArea() { Timer tmr = new Timer(); duleAtFixedRate(new JLabelTimerTask(),new Date(), ONE_SECOND); } /** * Timer task to the time display area * */ public class JLabelTimerTask extends TimerTask{ SimpleDateFormat dateFormatter = new SimpleDateFormat(DEFAULT_FORMAT, ISH); @Override public void run() { imeZone(timeZone); time = at(nstance()ime()); ext(time); } } /** * Update the timeZone * @param newZone */ public void updateTimeZone(TimeZone newZone) { Zone = newZone; } public static void main(String arg[]) { new WorldTimeFrame(); } }
本来需要在updateTimeZone(TimeZone newZone)中,更新displayArea的。但是考虑到TimerTask执行的.时间太短,才1秒钟,以肉眼观察,基本上是和立刻更新没区别。如果TimerTask执行时间长的话,这里就要立刻重新用心的时间更新一下displayArea。
补充:
①. pack() 用来自动计算屏幕大小;
②. vailableIDs() 用来获取所有的TimeZone。
JavaScript与java语言有何不同
经典Java面试题之Java中Char类型的运算
java构造函数实现代码示例
履历中如何显示实力
java显示图片的方法
关于java 四舍五入使java保留2位小数示例讲解
英文简历写作:如何显示自己
Java笔试试题如何实现对象克隆?
Java如何读取Jar中的资源
如何运用Java socket实现多人聊天室功能
如何写现实表现
JavaWeb如何实现文件上传下载功能
如何利用Java技术实现两个不同数据库之间的数据交换
Java如何实现简单的whois查询
如何实现java汉诺塔递归算法
如何学好Java 学习Java的步骤介绍
java与javascript之间json格式数据互转详解
从Java的jar文件中如何读取数据的方法
履历中如何显示实力?
如何实现javascript去除字符串里中文与空格
Javascript和Java语言间的异同比较
如何基于JavaScript实现本地图片预览
JAVA认证基础知识:Java文件解压缩示例
如何通过编程发现Java死锁
Java byte[]转int如何实现