我遇到了我正在使用的自定义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之间的互斥体,它们被从不同的线程调用,但我不认为这会导致问题?
GetImages()while循环中没有sleep()。什么控制了费率?它看起来像不停地运行1秒。 – tenorsax 2012-02-28 00:30:58
解码器意味着阻塞读取调用。一旦它有图像就返回。 – Constantin 2012-02-28 15:40:33