2012-03-24 4 views
5

現在の時刻が表示され、1秒ごとに更新されます。私が使用していたコードは次のとおりです。SwingWorkerとTimerを使用してラベルに時間を表示しますか?

int timeDelay = 1000; 
ActionListener time; 
time = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent evt) { 
      timeLabel.setText(DateTimeUtil.getTime()); 
      /*timeLabel is a JLabel to display time, 
      getTime() is samll static methos to return formatted String of current time */ 
     } 
    }; 
SwingWorker timeWorker = new SwingWorker() { 

     @Override 
     protected Object doInBackground() throws Exception { 

      new Timer(timeDelay, time).start(); 
      return null; 
     } 
    }; 
timeWorker.execute(); 

私はEDT以外の別のスレッドでtimeLabelテキストをリフレッシュしたいどのような。
正しくしていますか?他のより良い方法?
はまた情報のために、私はユーティリティのいくつかの類似の種類が含まれており、別のMainJFrameで呼び出されextendedJPaneltimeLabelを追加しました。

+4

@Jonas(1+)の優れたアドバイスに加えて、あなたが間違っていることの1つは、バックグラウンドスレッド内からSwing呼び出しを行うことです。 SwingWorkerの 'doInBackground()'メソッドは、バックグラウンドスレッドでは呼び出せないSwing呼び出しを含んではいけません。つまり、Swing Timerをこのメソッドの内部に作成したり、Swing Timerオブジェクトの 'start() 。このアドバイスについては –

+0

+1。ありがとうございました。もう1つのことは、 'doInBackground()'にSwing呼び出しを含めることができないということです。 'SwingWorker 'を介してパネル、ボタンなどのフレーム内のスイングコンポーネントを初期化すべきではないということですか? – Asif

+2

絶対に正しい。 SwingWorkerは、非Swingの初期化、およびpublish、process、およびdoneメソッドによるSwingとの通信用です。 –

答えて

11

これは、スイングタイマーが行われているため、SwingWorkerなしで行うことができます。

int timeDelay = 1000; 
ActionListener time; 
time = new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent evt) { 
     timeLabel.setText(DateTimeUtil.getTime()); 
     /* timeLabel is a JLabel to display time, 
      getTime() is samll static methos to return 
      formatted String of current time */ 
    } 
}; 

new Timer(timeDelay, time).start(); 
+0

スイングタイマーのアクション自体が別のスレッドで開始されていますか? – Asif

+1

@Asif:アクションはEDT上で実行されます。すべてのGUIの変更はEDTから最も多く行われるためです。 – Jonas

+0

ok..accepted..thanks – Asif

関連する問題