将图像添加到标签时 JFrame 上没有显示图像

问题描述

我编写了一些代码行,应该将图像显示为 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。尝试将 ImageObserverimage 设置为 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 的实例时,它将返回而不首先阻塞,直到图像完全加载。设置 ImageObserverImageIcon 将确保您提供的 ImageObserver 在状态更改时收到有关加载图像状态的通知。 Component(它是一个 ImageObserver)的默认实现会重新绘制自身,这样您就可以在图像准备就绪时看到完全加载的图像。

作为替代方案,您始终可以使用 ImageIO#read,它会一直阻塞,直到图像完全加载到内存中(但它只会返回动画 GIF 图像中的单个 frame 例如).

虽然我没有测试它,但这是我经常遇到的一个问题,所以我认为它应该可以工作。如果有或没有,请告诉我。