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 extended
JPanel
için timeLabel
ekledik ve başka Main
JFrame
yılında denir.
@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 –
+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
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. –