Java中如何实现显示动态的时间
本文所述实例可以实现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。
-
java读取解析xml文件实例
如何在Java中读取解析文件呢?下面小编为大家整理了java读取解析xml文件实例,希望能帮到大家!读取本地的xml文件,通过DOM进行解析,DOM解析的特点就是把整个xml文件装载入内存中,形成一颗DOM树形结构,树结构是方便遍历和和操纵。DOM解析的特性就是读取xml文件转换为dom...
-
java的基础语法教学
java的基础语法教学前言学习完了第一个java程序,之后就来系统的学习java。先从基础语法开始,这个语法你也可以理解为英语或是汉语里面的语法,只不过大家各有各的特点和区别。学习编程其实也是一个编程语言的学习过程。我们在学习英语的.时候都说,要想学习好英语一...
-
java与JavaScript语言有何不同
java和JavaScript是两个不同的语言。那么这两个语言有什么不同呢?下面本站小编带大家一起来看看详细内容,希望对大家有所帮助!想了解更多相关信息请持续关注我们应届毕业生考试网!讲个故事:话说很久很久以前,有一个叫网景(Netscape)的,十月怀胎,他生了个儿子,很开兴,...
-
新手学习Java最高效的10个计划
对于新手来说学习Java如同堵天书,下面是本站小编收集的关于新手学习Java最高效的10个计划,希望可以为您的学习带来帮助!计划一:了解未来技术发展方向两耳不闻窗外事,在如今是不合适的,尤其是在瞬息万变的互联网时代,作为一个开发者技术跟不上可以去专研,思想要跟不上,...