2012-04-04 28 views
5

Tôi muốn vẽ một hình ảnh trên bảng điều khiển của mình dựa trên dữ liệu tôi nhận được từ một chuỗi khác. Tôi chắc chắn rằng mảng dữ liệu và hậu quả pixel hoạt động tốt, nhưng repaint() sẽ không bao giờ hoạt động. Bất cứ ai có thể cho tôi biết những gì đang xảy ra ở đây?repaint() không hoạt động

import javax.swing.*; 
import java.awt.*; 
import java.awt.image.*; 

/** Create an image from a pixel array. **/ 
public class PicturePlaza extends JApplet 
{ 
    ImagePanel fImagePanel; 
    ReadCom readComPort; 
    Thread readPortThread; 

    public void init() { 
    // initiate the read port thread so that it can receive data 
    readComPort = new ReadCom(); 
    readPortThread = new Thread(readComPort,"ReadCom"); 
    readPortThread.start(); 

    Container content_pane = getContentPane(); 
    fImagePanel = new ImagePanel(); 
    content_pane.add (fImagePanel); 

    } 

    // Tell the panel to create and display the image, if pixel data is ready. 
    public void start() { 
     while(true){ 
      if(readComPort.newPic){ 
       fImagePanel.go(); 
      } 
      try { 
        Thread.sleep(4000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 


/** Create an image from a pixel array. **/ 
    class ImagePanel extends JPanel{ 
     Image fImage; 
     int fWidth = ReadCom.row, fHeight = ReadCom.col;  

     void go() {   
        //update the image if newPic flag is set to true     
        fImage = createImage (new MemoryImageSource (fWidth, fHeight, ReadCom.fpixel, 0, fWidth)); 
        repaint(); 
        readComPort.newPic = false; //disable the flag, indicating the image pixel has been used                
     } 

     /** Paint the image on the panel. **/ 
     public void paintComponent (Graphics g) { 
     super.paintComponent (g);  
     g.drawImage (fImage, 0, 0, this); 
     } 
    } 
} 

Cảm ơn

+9

'Thread.sleep (4000);' Không chặn EDT (Thread Dispatch Thread) - GUI sẽ 'đóng băng' khi điều đó xảy ra. Thay vì gọi 'Thread.sleep (n)' thực hiện một Swing 'Timer' để lặp lại các tác vụ hoặc một' SwingWorker' cho các tác vụ dài. Xem [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) để biết thêm chi tiết. –

+0

Cảm ơn bạn đã phản hồi ngay lập tức. Nhưng nếu tôi chỉ đơn giản loại bỏ câu lệnh Thread.sleep (4000), nó cũng không hoạt động. lý do cho điều đó là gì? – Daniel

+1

Nếu bạn chỉ cần đọc các liên kết tôi đã cung cấp và triển khai các đề xuất, điều gì sẽ xảy ra? –

Trả lời

0

Hãy thử repaint(); và sau đó validate(); trong Applet của bạn (PicturePlaza).

1

Chỉ một ghi chú nhỏ trên repaint(). repaint() lập lịch vẽ lại màn hình, nó sẽ không luôn làm điều đó ngay lập tức theo kinh nghiệm của tôi. Tôi tìm thấy giải pháp tốt nhất là trực tiếp gọi số paint().

Graphics g; 
g = getGraphics(); 
paint(g); 

Tôi đặt chức năng này làm hàm mới để gọi trong mã khi muốn vẽ ngay lập tức. Ngoài ra điều này sẽ không xóa các đồ họa trước đó trên màn hình, bạn sẽ phải làm điều đó bằng tay.