2011-12-02 68 views
0

我使用下面的程序來獲取時鐘。它究竟是一個靜態時鐘?爲什麼這樣?它爲什麼總是給出相同的時間?

import java.util.*; 
import java.awt.*; 
import javax.swing.*; 

class tester { 

    JFrame fr = new JFrame(); 
    JPanel p = new JPanel(); 
    JLabel l = new JLabel(); 
    Date d = new Date(); 
    GregorianCalendar gc = new GregorianCalendar(); 

    tester() { 
     p.setBackground(Color.red); 
     l.setVisible(true); 
     p.add(l); 
     fr.add(p); 
     fr.setSize(200,200); 
     fr.setVisible(true); 
     startClockThread(); 
    } 

    public void startClockThread() { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       startClock(); 
      } 
     }; 
     new Thread(r).start(); 
    } 

    public void startClock() { 
     l.setVisible(true); 
     while(true) { 
      l.setText(gc.get(gc.HOUR) + ":" + gc.get(gc.MINUTE) + ":" + gc.get(gc.SECOND)); 
      System.out.println(gc.get(gc.SECOND)); 
     } 
    } 

    public static void main(String args[]) { 
     new tester(); 
    } 
} 
+0

你應該寫一個Thread.sleep(1000);進入無限循環,除非你想讓你的茶在處理器的頂部保持熱點。 – pcjuzer

+0

請學習java命名約定並堅持使用它 – kleopatra

回答

2

GregorianCalendar()使用當前時間與默認語言環境的默認時區構造一個默認的GregorianCalendar。 Java Doc

你可以這樣做。

while(true) { 
     GregorianCalendar gc = new GregorianCalendar(); 
    l.setText(gc.get(gc.HOUR) + ":" + gc.get(gc.MINUTE) + ":" + gc.get(gc.SECOND)); 
} 

現在你應該明白你爲什麼得到一個靜態時鐘!

+0

我在想,如果這是一種在無限循環中構造多個對象的好方法! ? –

+1

順便說一句,有另一種解決方案,而不是每次構建一個新的GregorianCalendar實例:gc.setTimeInMillis(System.currentTimeInMillis()); – pcjuzer

+0

更好的是,不要連續循環[sleep()](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html#sleep(long))1000毫秒。或者使用[Timer](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html)。 –

2

您只創建一次GregorianCalendar,它永遠不會更新。所以日期總是一樣的。

2

有有大的問題除了你已經發現了一個:

  • 別讓線橫行,他們將凍結UI最終
  • 每訪問一個Swing組件必須發生在EDT

您可以通過使用一個javax.swing.Timer中

ActionListener nextSecond = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // get time ... 
     timeLabel.setText(...); 
    } 
} 
new Timer(1000, nextSecond).start(); 
解決這兩個最簡單的
+0

+ 1來獲得['javax.swing.Timer']的優點(http:// docs。 oracle.com/javase/tutorial/uiswing/misc/timer.html)。 – trashgod

相關問題