2012-02-27 16 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()