Я хочу, чтобы часы показывали текущее время и обновлялись каждую секунду. Код я использую:Использование 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();
То, что я хочу, чтобы обновить timeLabel
текст в другом потоке, чем EDT.
Я делаю это правильно? Любой другой лучший способ?
Кроме того, для информации, я добавил timeLabel
к extended
JPanel
, который содержит несколько подобных видов коммунальных услуг, и называется в другом Main
JFrame
.
В дополнение к отличному совету от @Jonas (1+), одна вещь, из-за которой вы делаете неправильно, - это вызов Swing из фоновой нити. Метод 'doInBackground()' SwingWorker не должен содержать никаких вызовов Swing, которые нельзя вызвать в фоновом потоке, что означает, что вы должны определенно не создавать таймер Swing внутри этого метода и незывать 'start()' в объекте Swing Timer здесь , –
+1 за этот совет. Спасибо. Еще одна вещь: 'doInBackground()' не может содержать вызовы Swing - это значит, что я не должен инициализировать компоненты swing внутри фрейма, например панели, кнопки и т. Д. Через 'SwingWorker'? – Asif
Абсолютно правильно. SwingWorker предназначен для инициализации без Swing и для связи с Swing с помощью методов публикации, обработки и выполнения. –