2012-03-24 12 views
5

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 extendedJPanel che contiene alcuni tipi simili di utilità, e si chiama in un altro MainJFrame.

+4

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 . –

+0

+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

+2

assolutamente corretto. SwingWorker è per l'inizializzazione di non Swing e per la comunicazione con Swing tramite metodi di pubblicazione, di elaborazione e di esecuzione. –

risposta

11

È possibile eseguire questa operazione senza uno SwingWorker, perché questo è lo scopo del timer dello swing.

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

Le azioni nel timer oscillante sono a sua volta iniziate in un thread diverso ?? – Asif

+1

@Asif: l'azione viene eseguita sull'EDT, poiché le modifiche alla GUI sono per lo più apportate dall'EDT. – Jonas

+0

ok..accettato..grazie – Asif

Problemi correlati