Voglio avere un orologio che mostra l'ora corrente e si aggiorna ogni secondo. Il codice che sto usando è:Utilizzo di SwingWorker e Timer per visualizzare l'ora su un'etichetta?
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();
Quello che voglio aggiornare il testo timeLabel
in un altro thread diverso da EDT.
Lo sto facendo correttamente? Qualunque altro modo migliore?
Anche per informazioni, ho aggiunto timeLabel
ad un extended
JPanel
che contiene alcuni tipi simili di utilità, e si chiama in un altro Main
JFrame
.
Oltre all'eccellente consiglio di @Jonas (1+), una cosa che si sta facendo male è rendere le chiamate Swing da un thread in background. Il metodo 'doInBackground()' di SwingWorker non dovrebbe contenere chiamate Swing che non possono essere chiamate su un thread in background, il che significa che non dovresti assolutamente creare uno Swing Timer all'interno di questo metodo, né chiamare 'start()' su un oggetto Swing Timer qui . –
+1 per questo consiglio. Grazie. Un'altra cosa è che 'doInBackground()' non può contenere le chiamate Swing - questo significa che non dovrei inizializzare i componenti swing all'interno di frame come pannelli, pulsanti etc tramite 'SwingWorker'? – Asif
assolutamente corretto. SwingWorker è per l'inizializzazione di non Swing e per la comunicazione con Swing tramite metodi di pubblicazione, di elaborazione e di esecuzione. –