I am having trouble with a custom JPanel class I am using. I have a networked camera which I am receiving Images from using an HttpURLConnection and a JPEGDecoder. These images are then displayed using Graphic.drawImage. The camera is set to run at 1 fps for debugging purposes.

This JPanel class is include inside one JFrame, I also have another JFrame which contains a NASA WorldWind. When displaying the pictures from the Camera, my WorldWind map is unresponsive and will not repaint when resized. I believe it is because my paintComponent in the custom JPanel is being spammed.

I do not understand what is calling my JPanel's paintComponent so much, and preventing my WorldWind Frame to update.

A blurb of the custom JPanel class follows:


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);
  }
}

Note, I do not call repaint() or force a paint anywhere. However, if I put a print out in my paint component class, it gets spammed at a much greater speed than 1 Hz. I am completely lost as to whats going on.

P.S. - I do realize I need a mutex between the paintComponent and the GetImages, they're being called from different threads, but I do not imagine that would cause the problem?

有帮助吗?

解决方案

I found my answer, I had to change my paint component

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

The paintComponent in my earlier code snippet seems to have an implicit paintComponent call in it somewhere... perhaps in (getWidth() and getHeight() or getScaledInstance())

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top