【问题标题】:No image showing on JFrame when adding image to label将图像添加到标签时,JFrame 上没有显示图像
【发布时间】:2021-04-09 22:28:55
【问题描述】:

我已经编写了一些代码行,这些代码应该将图像显示为 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);

【问题讨论】:

  • frame.setVisible(true); 成为你最后一次调用 - Swing 是懒惰的,当它改变时不会更新 UI,你需要自己做(这是对性能的优化)。另外,user15358848 所说的
  • @user15358848 是的,图像无法加载,我该如何解决?我也无法使用 ImageIO 打开它。
  • 应用程序资源在部署时将成为嵌入式资源,因此明智的做法是立即开始访问它们。 embedded-resource 必须通过 URL 而不是文件访问。请参阅info. page for embedded resource 了解如何形成 URL。

标签: java image swing jlabel imageicon


【解决方案1】:

正如您在问题的 cmets 中提示的那样,我认为您应该注意确保文件存在于指定位置,例如使用 getResource

除此之外,您没有将图像的观察者模式用于JLabel。尝试将imageImageObserver 设置为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 的实例时,它将返回而不会首先阻塞,直到图像被完全读取。设置ImageIconImageObserver 将确保您提供的ImageObserver 在状态更改时收到有关加载图像状态的通知。 Component(即ImageObserver)的默认实现会重新绘制自身,因此当图像准备好时,您将能够看到完全加载的图像。

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

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

【讨论】:

  • JLabel 实现 ImageObserver。它将观察通过ImageIcon 传递给它的任何Image 的加载。
  • @AndrewThompson 是的,当且仅当您致电 image.setImageObserver(label); 时,它才会观察到它。否则,label.setIcon(image); 是不够的,因为它不会检查提供的Icon 是否为ImageIcon。因此,还需要致电image.setImageObserver(label);。如果您按照文档上的链接,您可以清楚地看到推荐的方法是使用setImageIconsetIcon。正如我在回答中所说,Component 是一个ImageObserver。我不得不承认,虽然它可能不是那么清楚的声明,所以是的,你的评论应该是答案的一部分
猜你喜欢
  • 2013-08-04
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
相关资源
最近更新 更多