У меня проблемы с пользовательским классом 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, они вызываются из разных потоков, но я не думаю, что это вызовет проблему?