2012-03-24 31 views
5

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 extendedJPanel trong đó có vài loại tương tự của các tiện ích, và được gọi trong một MainJFrame.

+4

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

+0

+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

+2

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

Trả lời

11

Bạn có thể làm điều này mà không cần một SwingWorker, bởi vì đây là những gì các Swing Timer được thực hiện cho.

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

Hành động trong đồng hồ bấm giờ có bắt đầu trong một chủ đề khác không ?? – Asif

+1

@Asif: Hành động được thực hiện trên EDT, bởi vì tất cả các sửa đổi GUI nhất được tạo từ EDT. – Jonas

+0

ok..ccepted..thanks – Asif

Các vấn đề liên quan