私が使用しているカスタム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の間にミューテックスが必要であることを認識しています。別のスレッドから呼び出されていますが、問題が発生するとは思いませんか?私は私の答えを見つけた
ループ中にGetImages()にsleep()がありません。料金をコントロールするのは何ですか?それは1秒の停止なしで絶えず動くように見える。 – tenorsax
デコーダはブロッキングリードコールを意味します。それは一度それがイメージを持っていればそれを返します。 – Constantin