2012-02-27 17 views
0

我遇到了我正在使用的自定義JPanel類的問題。我有一個網絡攝像頭,我使用HttpURLConnection和JPEGDecoder接收圖像。這些圖像然後使用Graphic.drawImage顯示。爲了進行調試,相機設置爲以1 fps運行。自定義JPanel類,paintComponent正在被垃圾郵件

這個JPanel類包含在一個JFrame中,我還有另一個包含NASA WorldWind的JFrame。在顯示來自相機的圖片時,我的WorldWind地圖沒有反應,並且在調整大小時不會重繪。我相信這是因爲我的自定義JPanel中的paintComponent被垃圾郵件。

我不明白是什麼調用我的JPanel的paintComponent這麼多,並阻止我的WorldWind框架更新。

自定義JPanel類如下的導語:


public class ActiCamera extends JPanel implements Runnable 
{ 
    private String mjpgURL; 
    private DataInputStream dis; 

    public ActiCamera(String ip) 
    { 
    mjpgURL = "http://" + ip + "/cgi-bin/cmd/encoder?GET_STREAM"; 
    } 

    public void connect() 
    { 
    URL u = new URL(mjpgURL); 
    ... 
    dis = new DataInputStream(from buffered input stream from HttpURLConnection); 
    } 

    public void start() 
    { 
    appletThread = new Thread(this); 
    appletThread.start(); 
    } 

    public void run() 
    { 
    connect(); 
    GetImages(); 
    } 

    public void GetImages() 
    { 
    while(true) 
    { 
     //This blocks, executes at 1Hz 
     JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(dis); 
     image = decoder.decodeAsBufferedImage(); 
    } 
    } 

    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    if(image != null) 
     g.drawImage(image.getScaledInstance(getWidth(), getHeight(), Image.SCALE_DEFAULT), 0, 0, this); 
    } 

    public static void main(String [] args) 
    { 
    JFrame jframe = new JFrame(); 
    ActiCamera my_panel = new ActiCamera("1.1.1.1"); 
    my_panel.start(); 
    jframe.getContentPane().add(my_panel); 
    jframe.setVisible(true); 
    } 
} 

注意,我不叫重繪()或強制油漆的任何地方。但是,如果我在我的繪畫組件類中打印出來,它會以比1Hz更高的速度發送垃圾郵件。至於發生了什麼,我完全失去了。

P.S. - 我意識到我需要paintComponent和GetImages之間的互斥體,它們被從不同的線程調用,但我不認爲這會導致問題?

+0

GetImages()while循環中沒有sleep()。什麼控制了費率?它看起來像不停地運行1秒。 – tenorsax 2012-02-28 00:30:58

+0

解碼器意味着阻塞讀取調用。一旦它有圖像就返回。 – Constantin 2012-02-28 15:40:33

回答

0

,我發現我的回答,我不得不改變我的塗料成份

public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    if(image != null) 
    g.drawImage(image, 0, 0, this); 
} 

中的paintComponent在我前面的代碼片段似乎有它的一個隱含的paintComponent調用某個地方......也許在(getWidth()getHeight()getScaledInstance()