它为什么总是给出相同的时间?

时间:2011-12-02 08:47:02

标签: java swing time gregorian-calendar

我使用以下程序来获取时钟。结果是静态时钟?为什么会这样?

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

3 个答案:

答案 0 :(得分: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));
}

现在您应该明白为什么要获得静态时钟了!

答案 1 :(得分:2)

您只创建一次GregorianCalendar,它永远不会更新。所以日期总是一样的。

答案 2 :(得分: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();