Java Swing中ImageIcon添加到JFrame窗口无法显示该如何解决
Java Swing 图片不显示问题修复方案
错误原因
- 组件渲染顺序错误:代码先执行
a.setVisible(true)显示窗口,之后才添加JLabel组件,已完成渲染的窗口默认不会自动刷新新增的组件,导致图片不显示 - 图片路径无校验:
ImageIcon加载不存在的资源时不会抛出异常,仅会生成空图标,无法直接感知加载失败问题 - 违反Swing单线程规则:所有Swing组件的创建、属性修改、渲染操作必须在事件调度线程(EDT)中执行,否则可能出现偶发的渲染异常
修复后的代码
import javax.swing.*; import java.awt.MediaTracker; public class Tests { public static void main(String[] args){ // 所有Swing操作放入EDT线程执行 SwingUtilities.invokeLater(() -> { // 使用类加载器加载资源,避免相对路径匹配错误,将图片放在src根目录下即可 ImageIcon c = new ImageIcon(Tests.class.getResource("/BlackBishop.png")); // 图片加载结果校验 if (c.getImageLoadStatus() != MediaTracker.COMPLETE) { System.out.println("图片加载失败,请检查文件路径是否正确"); } JLabel b = new JLabel(c); JFrame a = new JFrame(); a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); a.setSize(500,500); // 先添加所有组件,再设置窗口可见 a.add(b); a.setVisible(true); }); } }
补充说明
- 如果你坚持使用相对路径加载图片,需要将
BlackBishop.png放在项目的工作目录根路径下(IDEA/Eclipse默认工作目录是项目根文件夹,和src同级) - 如果必须在窗口显示后新增组件,添加完成后需要手动调用
a.revalidate()和a.repaint()触发窗口重绘
内容的提问来源于stack exchange,提问作者ENDERFUN
相关产品推荐
相关产品推荐

