現在の時刻が表示され、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
テキストをリフレッシュしたいどのような。
正しくしていますか?他のより良い方法?
はまた情報のために、私はユーティリティのいくつかの類似の種類が含まれており、別のMain
JFrame
で呼び出されextended
JPanel
にtimeLabel
を追加しました。
@Jonas(1+)の優れたアドバイスに加えて、あなたが間違っていることの1つは、バックグラウンドスレッド内からSwing呼び出しを行うことです。 SwingWorkerの 'doInBackground()'メソッドは、バックグラウンドスレッドでは呼び出せないSwing呼び出しを含んではいけません。つまり、Swing Timerをこのメソッドの内部に作成したり、Swing Timerオブジェクトの 'start() 。このアドバイスについては –
+1。ありがとうございました。もう1つのことは、 'doInBackground()'にSwing呼び出しを含めることができないということです。 'SwingWorker 'を介してパネル、ボタンなどのフレーム内のスイングコンポーネントを初期化すべきではないということですか? – Asif
絶対に正しい。 SwingWorkerは、非Swingの初期化、およびpublish、process、およびdoneメソッドによるSwingとの通信用です。 –