簡體   English   中英

自定義JPanel類,paintComponent被發送垃圾郵件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM