Java中如何实现显示动态的时间

来源:才华咖  本文已影响3.6K人 

本文所述实例可以实现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。

相关内容

热门精选