Java實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示方法匯總
本文所述實(shí)例可以實(shí)現(xiàn)Java在界面上動(dòng)態(tài)的顯示時(shí)間。具體實(shí)現(xiàn)方法匯總?cè)缦拢?/p>
1.方法一 用TimerTask:
利用java.util.Timer和java.util.TimerTask來(lái)做動(dòng)態(tài)更新,畢竟每次更新可以看作是計(jì)時(shí)1秒發(fā)生一次。
代碼如下:
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來(lái)創(chuàng)建一個(gè)自定義的task,獲取當(dāng)前時(shí)間,更新displayArea.
然后創(chuàng)建一個(gè)timer的實(shí)例,每1秒執(zhí)行一次timertask。由于用schedule可能會(huì)有時(shí)間誤差產(chǎn)生,所以直接調(diào)用精度更高的scheduleAtFixedRate的。
2. 方法二:利用線(xiàn)程:
這個(gè)就比較簡(jiǎn)單了。具體代碼如下:
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();
}
}
比較:
個(gè)人傾向于方法一,因?yàn)門(mén)imer是可以被多個(gè)TimerTask共用,而產(chǎn)生一個(gè)線(xiàn)程,會(huì)增加多線(xiàn)程的維護(hù)復(fù)雜度。
注意如下代碼:
jFrame.setDefaultCloseOperation(); // 給關(guān)閉按鈕增加特定行為 jFrame.setLocationRelativeTo(null); // 讓Frame一出來(lái)就在屏幕中間,而不是左上方。
將上面方法一稍微一修改,就可以顯示多國(guó)時(shí)間。代碼如下:
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();
}
}
本來(lái)需要在updateTimeZone(TimeZone newZone)中,更新displayArea的。但是考慮到TimerTask執(zhí)行的時(shí)間太短,才1秒鐘,以肉眼觀(guān)察,基本上是和立刻更新沒(méi)區(qū)別。如果TimerTask執(zhí)行時(shí)間長(zhǎng)的話(huà),這里就要立刻重新用心的時(shí)間更新一下displayArea。
補(bǔ)充:
①. pack() 用來(lái)自動(dòng)計(jì)算屏幕大小;
②. TimeZone.getAvailableIDs() 用來(lái)獲取所有的TimeZone。
相關(guān)文章
springboot接口服務(wù),防刷、防止請(qǐng)求攻擊,AOP實(shí)現(xiàn)方式
本文介紹了如何使用AOP防止Spring?Boot接口服務(wù)被網(wǎng)絡(luò)攻擊,通過(guò)在pom.xml中加入AOP依賴(lài),創(chuàng)建自定義注解類(lèi)和AOP切面,以及在業(yè)務(wù)類(lèi)中使用這些注解,可以有效地對(duì)接口進(jìn)行保護(hù),測(cè)試表明,這種方法有效地防止了網(wǎng)絡(luò)攻擊2024-11-11
java使用jacob.jar將word轉(zhuǎn)pdf
這篇文章主要為大家詳細(xì)介紹了java利用jacob.jar將word轉(zhuǎn)pdf,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
SpringCloud OpenFeign基本介紹與實(shí)現(xiàn)示例
OpenFeign源于Netflix的Feign,是http通信的客戶(hù)端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開(kāi)發(fā),讓開(kāi)發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02
Java?CompletableFuture實(shí)現(xiàn)多線(xiàn)程異步編排
這篇文章主要為大家介紹了Java?CompletableFuture實(shí)現(xiàn)多線(xiàn)程異步編排,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Mybatis-plus插入數(shù)據(jù)遇到主鍵沒(méi)有默認(rèn)值的情況
這篇文章主要介紹了Mybatis-plus插入數(shù)據(jù)遇到主鍵沒(méi)有默認(rèn)值的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
SpringBoot集成ShedLock實(shí)現(xiàn)分布式定時(shí)任務(wù)
ShedLock 是一個(gè) Java 庫(kù),通常用于分布式系統(tǒng)中,確保定時(shí)任務(wù)(Scheduled Tasks)在集群環(huán)境下只被某一個(gè)實(shí)例執(zhí)行一次,它通過(guò)在共享資源中添加鎖的方式,本文給大家介紹了SpringBoot集成ShedLock實(shí)現(xiàn)分布式定時(shí)任務(wù),需要的朋友可以參考下2024-11-11
Spring注解 TX聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Spring注解 - TX 聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java ServletContext對(duì)象用法解析
這篇文章主要介紹了Java ServletContext對(duì)象用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
一天時(shí)間用Java寫(xiě)了個(gè)飛機(jī)大戰(zhàn)游戲,朋友直呼高手
前兩天我發(fā)現(xiàn)論壇有兩篇飛機(jī)大戰(zhàn)的文章異?;鸨?但都是python寫(xiě)的,竟然不是我大Java,說(shuō)實(shí)話(huà)作為老java選手,我心里是有那么一些失落的,今天特地整理了這篇文章,需要的朋友可以參考下2021-05-05

