2012-03-24 2 views
5

Я хочу, чтобы часы показывали текущее время и обновлялись каждую секунду. Код я использую:Использование 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 к extendedJPanel, который содержит несколько подобных видов коммунальных услуг, и называется в другом MainJFrame.

+4

В дополнение к отличному совету от @Jonas (1+), одна вещь, из-за которой вы делаете неправильно, - это вызов Swing из фоновой нити. Метод 'doInBackground()' SwingWorker не должен содержать никаких вызовов Swing, которые нельзя вызвать в фоновом потоке, что означает, что вы должны определенно не создавать таймер Swing внутри этого метода и незывать 'start()' в объекте Swing Timer здесь , –

+0

+1 за этот совет. Спасибо. Еще одна вещь: 'doInBackground()' не может содержать вызовы Swing - это значит, что я не должен инициализировать компоненты swing внутри фрейма, например панели, кнопки и т. Д. Через 'SwingWorker'? – Asif

+2

Абсолютно правильно. SwingWorker предназначен для инициализации без Swing и для связи с Swing с помощью методов публикации, обработки и выполнения. –

ответ

11

Вы можете сделать это без SwingWorker, потому что это то, для чего предназначен Swing 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 */ 
    } 
}; 

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

Является ли действие в режиме качания Таймер сам начинается в другой теме? – Asif

+1

@Asif: Действие выполняется на EDT, поскольку модификации GUI alla сделаны из EDT. – Jonas

+0

ok..принято..отчет – Asif