2012-02-27 3 views
0

私が使用しているカスタムJPanelクラスに問題があります。私はHttpURLConnectionとJPEGDecoderを使って画像を受け取っているネットワークカメラを持っています。これらの画像は、Graphic.drawImageを使用して表示されます。カメラはデバッグの目的で1 fpsで動作するように設定されています。カスタムJPanelクラス、paintComponentがスパムされています

このJPanelクラスは1つのJFrameに含まれていますが、NASA WorldWindを含む別のJFrameもあります。カメラからの画像を表示するとき、私のWorldWindマップは応答しませんし、サイズを変更すると再描画されません。カスタムJPanelのpaintComponentがスパムされているためです。

JPanelのpaintComponentをあまりにも多く呼び出すことがわかりませんし、WorldWind Frameの更新を妨げています。

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()にsleep()がありません。料金をコントロールするのは何ですか?それは1秒の停止なしで絶えず動くように見える。 – tenorsax

+0

デコーダはブロッキングリードコールを意味します。それは一度それがイメージを持っていればそれを返します。 – Constantin

答えて

0

、私は私の塗料・コンポーネントを変更する

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

を持っていた私の以前のコードスニペットでpaintComponentは、おそらく(getWidth()getHeight()に...どこかで暗黙のpaintComponentコールを持っているようですかgetScaledInstance()

関連する問題