问题描述
我编写了一些代码行,应该将图像显示为 JFrame 中的标签。这是代码。
ImageIcon image = new ImageIcon("funny.jpg");
JLabel label = new JLabel();
label.setIcon(image);
JFrame frame = new JFrame();
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setVisible(true);
frame.add(label);
解决方法
正如您在问题的评论中所提示的那样,我认为您应该注意确保该文件存在于指定位置,例如使用 getResource
。
除此之外,您没有将图像的观察者模式用于 JLabel
。尝试将 ImageObserver
的 image
设置为 label
,如下所示:
ImageIcon image = new ImageIcon("funny.jpg");
JLabel label = new JLabel();
label.setIcon(image);
image.setImageObserver(label); // <-- Added this line.
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,500);
frame.setVisible(true);
frame.add(label);
否则,请参阅the corresponding documentation on setImageObserver
。
您也可以勾选the corresponding tutorials' section。
这恰好是因为,据我所知,ImageIcon
使用 MediaTracker
异步加载图像,因此当您构造 ImageIcon
的实例时,它将返回而不首先阻塞,直到图像完全加载。设置 ImageObserver
的 ImageIcon
将确保您提供的 ImageObserver
在状态更改时收到有关加载图像状态的通知。 Component
(它是一个 ImageObserver
)的默认实现会重新绘制自身,这样您就可以在图像准备就绪时看到完全加载的图像。
作为替代方案,您始终可以使用 ImageIO#read
,它会一直阻塞,直到图像完全加载到内存中(但它只会返回动画 GIF 图像中的单个 frame 例如).
虽然我没有测试它,但这是我经常遇到的一个问题,所以我认为它应该可以工作。如果有或没有,请告诉我。