Tôi muốn có đồng hồ hiển thị thời gian hiện tại và làm mới mỗi giây. Mã tôi đang sử dụng là:Sử dụng SwingWorker và Timer để hiển thị thời gian trên nhãn?
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();
Tôi muốn làm mới văn bản timeLabel
trong một chủ đề khác ngoài EDT.
Tôi có làm đúng không? Bất kỳ cách nào tốt hơn?
Ngoài ra để biết thông tin, tôi đã thêm timeLabel
đến một extended
JPanel
trong đó có vài loại tương tự của các tiện ích, và được gọi trong một Main
JFrame
.
Ngoài lời khuyên tuyệt vời từ @Jonas (1+), một điều bạn đang làm sai là thực hiện cuộc gọi Swing từ trong chuỗi nền. Phương thức 'doInBackground()' của SwingWork không chứa các cuộc gọi Swing mà không thể được gọi trên một luồng nền, có nghĩa là bạn chắc chắn không nên tạo một Swing Timer bên trong phương thức này, cũng không gọi 'start()' trên đối tượng Swing Timer tại đây . –
+1 cho lời khuyên này. Cảm ơn bạn. Một điều nữa là, 'doInBackground()' không thể chứa các cuộc gọi Swing - điều đó có nghĩa là tôi không nên khởi tạo các thành phần swing bên trong khung như các bảng, nút, v.v. qua 'SwingWorker'? – Asif
Hoàn toàn chính xác. SwingWorker là để khởi tạo không Swing và cho giao tiếp với Swing thông qua xuất bản, quá trình, và phương pháp thực hiện. –