2012-01-20 29 views
8

我正嘗試使用線程創建數字時鐘,因爲在我看來,這是一種合乎邏輯的方式。 我不知道我是否正確地做了這件事,但是我的想法是使用JFrame構造函數創建初始當前系統時間,並使用標籤將其顯示爲文本。然後在構造函數中創建用於更新時間的線程對象。使用線程創建數字時鐘

掙扎了一下,希望得到一些關於如何正確使用它的建議。

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

     } 

這是我的run()方法每秒鐘更新時鐘。

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){} 

    } 

主要方法。

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


} 
+0

你有什麼特別的掙扎?它看起來像runner永遠不會是空的,因爲你實例化並且在你的while(runner == null)檢查之前爲它分配一個Thread對象。哦,+1純粹是因爲看到一個實際上已經嘗試過的作業問題的罕見之處,然後再問這裏:) –

回答

2

標籤狀態應在事件派發線程中更新。

您需要添加以下修改:

SwingUtilities.invokeLater(new Runnable() { 

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

,而不是簡單地從單獨的線程更新標籤。

值得看看The Swing GUI Freezing Problem的簡單描述,這是一個簡單的解決方案。

2

你想要改進什麼?它看起來不錯,while(runner == null)沒有必要,你剛剛在上面初始化跑步者。