2012-01-20 20 views
8

Tôi đang cố gắng tạo đồng hồ kỹ thuật số bằng cách sử dụng một Chủ đề vì điều này dường như với tôi một cách hợp lý sẽ làm điều đó. Tôi không chắc chắn nếu tôi đang đi về nó đúng cách nhưng những gì tôi đã có trong tâm trí là để tạo ra thời gian hệ thống hiện tại ban đầu bằng cách sử dụng constructor JFrame và hiển thị nó như văn bản bằng cách sử dụng một nhãn. Trong hàm tạo, sau đó tôi tạo đối tượng chuỗi để cập nhật thời gian.Tạo đồng hồ kỹ thuật số bằng cách sử dụng một sợi

Đấu tranh một chút và hy vọng có một số lời khuyên về cách thực hiện đúng.

setDefaultCloseOperation((JFrame.EXIT_ON_CLOSE)); 
     setBounds(50, 50, 200, 200); 

     JPanel pane = new JPanel(); 
     label = new JLabel(); 

     //Font localTime = new Font("Lumina", Font.BOLD , 24); 

     pane.add(label); 
     add(pane); 
     sdf = new SimpleDateFormat("HH:mm:ss"); 
     date = new Date(); 

     s = sdf.format(date); 
     label.setText(s); 
     setVisible(true); 
     runner = new Thread(this); 

     while(runner == null) 
     { 
      runner = new Thread(this); 
      runner.start(); 

     } 

Đây là phương thức run() của tôi để cập nhật đồng hồ mỗi giây.

public void run() 
{ 
    while(true) 
    { 
     try 
     { 
      Thread.sleep(1000); 
      sdf = new SimpleDateFormat("HH:mm:ss"); 
      date = new Date(); 
      s = sdf.format(date); 
      label.setText(s); 
     } 
     catch(Exception e){} 

    } 

Phương pháp chính.

public static void main(String[] args) 
{ 
    new DigitalClock().setVisible(true); 


} 
+0

Cụ thể bạn đang đấu tranh với điều gì? Nó cũng giống như runner sẽ không bao giờ là null, khi bạn khởi tạo và gán một đối tượng Thread cho nó ngay trước khi kiểm tra (runner == null) của bạn. Oh và +1 hoàn toàn là hiếm khi nhìn thấy một câu hỏi bài tập về nhà đã thực sự được cố gắng trước khi yêu cầu ở đây :) –

Trả lời

2

Trạng thái nhãn phải được cập nhật trong Chủ đề công văn sự kiện.

Bạn cần phải thêm việc sửa đổi như sau:

SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      label.setText(s); 
     } 
    }); 

thay vì chỉ đơn giản là cập nhật các nhãn từ các chủ đề riêng biệt.

Bạn nên xem mô tả đơn giản của The Swing GUI Freezing Problem và giải pháp đơn giản.

2

Bạn muốn cải thiện điều gì? Có vẻ ok, while(runner == null) không cần thiết, bạn đang khởi tạo nhân vật ngay phía trên.

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