Java Swing开发石头剪刀布游戏时添加的图片运行后不显示
问题原因及修复方案
核心错误点
- 组件添加容器错误:你在
actionPerformed中新建了名为Play的JFrame窗口,但调用add()方法时默认将标签添加到了btnPlay实例对应的容器,根本没有添加到你实际显示的Play窗口上。另外你用了绝对定位setBounds,没有给Play设置空布局,setBounds属性不会生效。 - 组件重叠:三个
JLabel的setBounds参数完全一致,都在同一个位置,即使图片加载成功也只会显示最上层的一个组件。 - 窗口刷新时机错误:你在窗口初始化之初就调用了
setVisible(true),后续添加的组件不会自动渲染到已经显示的窗口上,要么把setVisible放到所有组件添加完成之后,要么添加完组件后手动调用刷新方法。 - 图片路径问题:直接写
"PaperVec.png"相对路径是相对于程序运行时的工作目录,而非代码文件存放目录,大概率是路径不匹配导致图片加载失败,且ImageIcon加载失败不会抛出异常,只会显示空图标,所以你看不到报错。
修复要点
- 给新建的
JFrame设置空布局,且把组件添加到该窗口上:
JFrame Play = new JFrame(); Play.setTitle("ROCK, PAPER, SCISSOR"); Play.setSize(375,375); Play.setLayout(null); // 启用绝对定位 // 所有组件添加操作放在这 Play.add(PaperLabel); Play.add(RockLabel); Play.add(ScissorLabel); Play.setVisible(true); // 所有组件加完再显示窗口
- 调整三个标签的坐标避免重叠,比如:
PaperLabel.setBounds(50,200,100,100); RockLabel.setBounds(150,200,100,100); ScissorLabel.setBounds(250,200,100,100);
- 修正图片加载逻辑,用类加载器读取资源避免路径问题,确认图片放到项目src根目录下:
// 先判断资源是否存在,为空就是没找到图片 URL imgUrl = getClass().getResource("/PaperVec.png"); if (imgUrl != null) { PaperVec = new ImageIcon(new ImageIcon(imgUrl).getImage().getScaledInstance(80, 80, Image.SCALE_DEFAULT)); }
内容的提问来源于stack exchange,提问作者Blackfaith
相关产品推荐
相关产品推荐

