Пользовательский класс JPanel, paintComponent является спамом - PullRequest
0 голосов
/ 28 февраля 2012

У меня проблемы с пользовательским классом JPanel, который я использую. У меня есть сетевая камера, которую я получаю изображения с использованием HttpURLConnection и JPEGDecoder. Эти изображения затем отображаются с использованием Graphic.drawImage. Для отладки камера настроена на скорость 1 кадр / с.

Этот класс JPanel включен в один JFrame, у меня также есть другой JFrame, который содержит NASA WorldWind. При отображении изображений с камеры моя карта WorldWind не отвечает и не перекрашивается при изменении размера. Я полагаю, что это потому, что мой paintComponent в пользовательском JPanel является спамом.

Я не понимаю, что вызывает так называемый paintComponent моего JPanel и не позволяет обновить мой 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 Гц. Я полностью потерян в отношении того, что происходит.

P.S. - Я понимаю, что мне нужен мьютекс между paintComponent и GetImages, они вызываются из разных потоков, но я не думаю, что это вызовет проблему?

1 Ответ

0 голосов
/ 28 февраля 2012

Я нашел свой ответ, мне пришлось поменять компонент краски

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

Кажется, что в paintComponent в моем предыдущем фрагменте кода где-то есть неявный вызов paintComponent ... возможно, в (getWidth() и getHeight() или getScaledInstance())

...