2012-01-20 13 views
8

スレッドを使用してデジタル時計を作成しようとしています。 私は正しい方法を検討しているかどうかは分かりませんが、私が心に留めていたことは、JFrameコンストラクタを使用して初期の現在のSystem時刻を作成し、ラベルを使用してテキストとして表示することです。コンストラクタで、私は時間を更新するスレッドオブジェクトを作成します。スレッドを使用してデジタル時計を作成する

少し苦労して、それを正しく行う方法についてのアドバイスが必要でした。

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

     } 

これは、1秒ごとに時計を更新する私の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がnullにならないようにも見えますが、while(runner == null)チェックの直前にThreadオブジェクトをインスタンス化して割り当てます。ああ、純粋にここで質問する前に実際に試行された宿題に関する質問を見ることはまれである。 –

答えて

2

イベントディスパッチスレッドでは、ラベルの状態を更新する必要があります。単に別のスレッドからラベルを更新するのではなく、

SwingUtilities.invokeLater(new Runnable() { 

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

は、次の変更を追加する必要があります。

The Swing GUI Freezing Problemの簡単な説明を読んだだけで簡単な解決策です。

2

あなたは何を改善したいですか?それは大丈夫です、while(runner == null)は必要ありません、ちょうど上のランナーを初期化しています。

関連する問題