[英]Custom JPanel Class, paintComponent is Being Spammed
我在使用自定义的JPanel类时遇到麻烦。 我有一台联网的摄像机,正在使用HttpURLConnection和JPEGDecoder接收图像。 然后使用Graphic.drawImage显示这些图像。 出于调试目的,将摄像机设置为以1 fps的速度运行。
这个JPanel类包含在一个JFrame中,我还有另一个JFrame包含NASA WorldWind。 当显示“相机”中的图片时,我的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);
}
}
注意,我不会在任何地方调用repaint()或强制绘制。 但是,如果将打印输出放到我的绘画组件类中,它会以比1 Hz大得多的速度发送垃圾邮件。 我完全不知道发生了什么事。
PS-我确实意识到我需要在paintComponent和GetImages之间使用互斥体,它们是从不同的线程调用的,但是我不认为这会引起问题吗?
我找到了答案,我不得不更换油漆成分
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if(image != null)
g.drawImage(image, 0, 0, this);
}
我之前的代码片段中的paintComponent似乎在某个地方有一个隐式的paintComponent调用...也许在( getWidth()
和getHeight()
或getScaledInstance()
)中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.