2014-02-12 50 views
0

我想知道什么是在JAVA中显示和更新图像的最快方式。我从套接字连续接收一系列图像,并且想要实时显示它们。我目前在JFrame中使用Jlabel。如何快速更新在Java GUI中的图像

void refreshScreen(BufferedImage bufImg) 
{ 
label.setIcon(new ImageIcon(bufImg)); 
frame.repaint(); 
frame.getContentPane().repaint(); 
} 

但是,这是非常慢,需要15-20秒甚至在我的快速电脑上更新。什么是这样做的理想方式?

+2

如果JLabel的图标发生更改,则无需调用重新绘制。你的关键是在后台线程中读入图像,创建你的ImageIcon并在Swing事件线程上设置标签的图标。请注意,您的速度与Swing无关,并与通过Socket传输图像有关。 –

回答

1

问题不会更新图像。当您设置JLabel的图标时,它会立即重新绘制自己。

这个问题可能是在通过套接字接收图像(您的计算机的速度在这里没有效果)。您必须确保使用套接字的代码不会阻塞事件调度线程,因为这会阻止GUI重新绘制自己。所以你需要为Socket连接使用一个单独的线程。

请参阅Concurrency的Swing教程中的部分了解更多信息。

+0

我每次收到套接字中的图像时都会调用refreshScreen()。我发现这些图像很快就会被插入到插槽中,但显示时却存在延迟。所以我猜socket不是这里的瓶颈,它是显示图像。 – user2600028

+0

@ user2600028,问题不在于显示图像。一旦图像被完全加载,这将立即发生。正如我之前所建议的那样,您必须阻止EDT,因此无法重新绘制图像。阅读教程。 – camickr