国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java實現時間動態顯示方法匯總

2019-11-26 15:27:24
字體:
來源:轉載
供稿:網友

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂伦春自治旗| 安岳县| 清丰县| 通山县| 禹城市| 堆龙德庆县| 永寿县| 江华| 伊金霍洛旗| 玉门市| 山东| 靖安县| 高密市| 偏关县| 安义县| 六盘水市| 额尔古纳市| 汉源县| 璧山县| 青川县| 湛江市| 高邮市| 建阳市| 马公市| 广东省| 穆棱市| 台东市| 白水县| 班戈县| 句容市| 周口市| 敦化市| 兴化市| 永清县| 泗阳县| 华宁县| 海盐县| 应城市| 西充县| 芷江| 芷江|