Frage

Ich habe das folgende Programm verwendet, um die Uhr abzurufen. Was sich herausstellte, ist eine statische Uhr ?Warum ist es so?

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

War es hilfreich?

Lösung

GregorianCalendar() Erstellt einen Gregorianischen Standardkalender unter Verwendung der aktuellen Zeit in der Standardzeitzone mit dem Standardgebietsschema. Java Doc

Sie können dies auf diese Weise tun.

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

Jetzt sollten Sie verstehen, warum Sie eine statische Uhr erhalten!

Andere Tipps

Sie erstellen den Gregorianischen Kalender nur einmal und er wird nie aktualisiert.Das Datum ist also immer das gleiche.

Abgesehen von dem, das Sie entdeckt haben, gibt es große Probleme:

  • Lass Threads nicht wild laufen, sie frieren die Benutzeroberfläche schließlich ein
  • Jeder Zugriff auf eine Swing-Komponente muss auf dem EDT erfolgen

    Sie können beide am einfachsten lösen, indem Sie einen javax.swing.Timer verwenden

    ActionListener nextSecond = new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
             // get time ...
             timeLabel.setText(...);
         }
    }
    new Timer(1000, nextSecond).start();
    

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top