2012-01-20 8 views
8

Próbuję utworzyć zegar cyfrowy za pomocą wątku, ponieważ wydaje mi się to logiczne, jak można to zrobić. Nie jestem pewien, czy robię to we właściwy sposób, ale to, co miałem na myśli, to stworzyć początkowy bieżący czas systemowy za pomocą konstruktora JFrame i wyświetlić go jako tekst za pomocą etykiety. W konstruktorze następnie utworzę obiekt wątku, za pomocą którego zaktualizuję czas.Tworzenie zegara cyfrowego za pomocą wątku

Trochę się zmagając i liczyłem na jakąś radę, jak to zrobić dobrze.

setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE)); 
     setBounds(50, 50, 200, 200); 

     JPanel pane = new JPanel(); 
     label = new JLabel(); 

     //Font localTime = new Font("Lumina", Font.BOLD , 24); 

     pane.add(label); 
     add(pane); 
     sdf = new SimpleDateFormat("HH:mm:ss"); 
     date = new Date(); 

     s = sdf.format(date); 
     label.setText(s); 
     setVisible(true); 
     runner = new Thread(this); 

     while(runner == null) 
     { 
      runner = new Thread(this); 
      runner.start(); 

     } 

To jest moja metoda run(), która aktualizuje zegar co sekundę.

public void run() 
{ 
    while(true) 
    { 
     try 
     { 
      Thread.sleep(1000); 
      sdf = new SimpleDateFormat("HH:mm:ss"); 
      date = new Date(); 
      s = sdf.format(date); 
      label.setText(s); 
     } 
     catch(Exception e){} 

    } 

Główna metoda.

public static void main(String[] args) 
{ 
    new DigitalClock().setVisible(true); 


} 
+0

Z czym szczególnie się zmagasz? Wygląda również na to, że runner nigdy nie będzie miał wartości NULL, ponieważ tworzysz instancję i przypisujesz do niej obiekt Thread, tuż przed sprawdzeniem twojej wartości while (runner == null). Och i +1 czysto za rzadkość zobaczenia pytania o pracę domową, które faktycznie było próbowane zanim zapytasz tutaj :) –

Odpowiedz

2

Stan etykiety powinien zostać zaktualizowany w wątku wysyłania zdarzeń.

Trzeba dodać następujące zmiany:

SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      label.setText(s); 
     } 
    }); 

zamiast po prostu aktualizowanie etykietę z osobnym wątku.

Warto rzucić okiem na prosty opis The Swing GUI Freezing Problem i jest to proste rozwiązanie.

2

Co chcesz poprawić? Wygląda OK, while(runner == null) nie jest konieczne, uruchamiasz biegacza tuż powyżej.

Powiązane problemy