2011-12-02 38 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

相关问题