自定义JPanel类,paintComponent被垃圾邮件

时间:2012-02-27 21:44:34

标签: java swing paintcomponent

我正在使用我正在使用的自定义JPanel类。我有一个联网的摄像头,我正在使用HttpURLConnection和JPEGDecoder接收图像。然后使用Graphic.drawImage显示这些图像。相机设置为以1 fps运行以进行调试。

这个JPanel类包含在一个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);
  }
}

注意,我不会在任何地方调用repaint()或强制绘画。但是,如果我在我的绘画组件类中打印出一个打印件,它会以比1 Hz更快的速度发送垃圾邮件。关于最新情况,我完全迷失了。

P.S。 - 我确实意识到我需要在paintComponent和GetImages之间使用互斥锁,它们是从不同的线程调用的,但我不认为这会导致问题?

1 个答案:

答案 0 :(得分:0)

我找到了答案,我不得不改变我的涂料成分

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

我之前的代码片段中的paintComponent似乎在某个地方有一个隐式的paintComponent调用...可能在(getWidth()getHeight()getScaledInstance()