2012-03-24 18 views
5

Geçerli saati gösteren ve her saniyede yenen bir saat istiyorum. Ben kullanıyorum kodudur:Etiket üzerindeki saati görüntülemek için SwingWorker ve Timer'ı kullanma?

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 dışındaki başka bir iş parçacığı timeLabel metni yenilemek istiyorum ne.
Doğru mu yapıyorum? Daha iyi bir yol var mı?
Ayrıca bilgi için, i araçlardan birkaç benzer türde içeren bir extendedJPanel için timeLabel ekledik ve başka MainJFrame yılında denir.

+4

@Jonas (1+) 'dan gelen mükemmel tavsiyeye ek olarak, yanlış yaptığınız bir şey de Swing çağrılarını arka plan iş parçacığı içinden yapmaktır. SwingWorker'ın doInBackground() yöntemi, arka plan iş parçacığı üzerinde çağrılamayan Swing çağrıları içermemelidir; bu, bu yöntemin içinde kesinlikle bir Swing Timer oluşturmamanız ve Swing Timer nesnesinde 'start()' işlevini çağırmamanız anlamına gelir. . Bu öneri için –

+0

+1. Teşekkür ederim. Bir şey daha, 'doInBackground() 'Swing çağrıları içeremez - bu, SwingWorker' aracılığıyla paneller, düğmeler vb. Gibi çerçeve içindeki salınım bileşenlerini başlatmamam gerektiği anlamına mı geliyor? – Asif

+2

Kesinlikle doğru. SwingWorker, Swing olmayan başlatma ve yayınlama, işlem ve bitmiş yöntemler aracılığıyla Swing ile iletişim içindir. –

cevap

11

Bunu SwingWorker olmadan yapabilirsiniz, çünkü bu, Swing Timer öğesinin ne için yapıldığıdır.

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

Aksiyonlar sallanırken Zamanlayıcı kendini farklı bir iş parçacığında mı başlatıyor? – Asif

+1

@Asif: Eylem EDT'de gerçekleştirilir, çünkü alla GUI modifikasyonları en çok EDT'den yapılır. – Jonas

+0

ok..accepted..thanks – Asif