почему это всегда дает одинаковое время? - PullRequest
0 голосов
/ 02 декабря 2011

Я использовал следующую программу, чтобы получить часы. Что это за статические часы ? Почему это так?

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 ]

2 голосов
/ 02 декабря 2011

Вы создаете GregorianCalendar только один раз, и он никогда не обновляется.Так что дата всегда одна и та же.

2 голосов
/ 02 декабря 2011

есть большие проблемы, кроме той, которую вы заметили:

  • не позволяйте потокам работать вхолостую, они в конечном итоге замораживают пользовательский интерфейс
  • каждый доступ к Swingкомпонент должен произойти в EDT

Вы можете решить обе эти проблемы проще всего, используя javax.swing.Timer

ActionListener nextSecond = new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
         // get time ...
         timeLabel.setText(...);
     }
}
new Timer(1000, nextSecond).start();
2 голосов
/ 02 декабря 2011

GregorianCalendar() Создает GregorianCalendar по умолчанию, используя текущее время в часовом поясе по умолчанию с языковым стандартом по умолчанию. Java Doc

Вы можете сделать это так.

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

Теперь вы должны понять, почему вы получаете статические часы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...