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);

}

}

继承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();

}

}

比较:

个人倾向于方法一,因为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();

}

}

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

补充:

①. pack() 用来自动计算屏幕大小;

②. TimeZone.getAvailableIDs() 用来获取所有的TimeZone。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值