继承JPanel的自定义类中ImageIcon无法显示,写在JFrame中正常是什么原因?
问题原因
- 核心问题是
TestPanel使用了null绝对布局,所有添加到该面板的子组件必须手动设置坐标和尺寸,你只给TestPanel本身设置了bounds,但内部用来承载图片的mapJLabel没有设置尺寸,Swing默认组件尺寸为0×0,因此无法渲染出图标。你把代码直接写到GUI构造方法中时,应该是顺便给对应JLabel设置了尺寸,所以可以正常显示。 - 冗余问题:
TestPanel中的map被static修饰,多个TestPanel实例会共享同一个JLabel组件,属于错误的用法;同时你在GUI类中又定义了一个同名的静态JLabel,容易造成逻辑混乱。 - 冗余问题:
TestPanel构造方法中重复调用了两次setBounds,没有实际意义。
修复方法
- 给
mapJLabel设置和图标一致的尺寸,在map.setIcon(image);后添加如下代码:
map.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
- 去掉
TestPanel中map变量前的static修饰符,每个面板实例持有独立的标签组件。 - (可选建议)尽量避免使用
null绝对布局,改用BorderLayout布局的话,把map添加到CENTER位置即可自动填充整个面板,不需要手动计算所有组件的尺寸和位置,代码更易维护。
修复后完整TestPanel代码
public class TestPanel extends JPanel { // 去掉static修饰符 public JLabel map = new JLabel(); public TestPanel() { this.setLayout(null); this.setBackground(new Color(0,0,0)); Image imageToScale = new ImageIcon("map.png").getImage(); double scale = .9; int x = (int) (imageToScale.getWidth(null) * scale); int y = (int) (imageToScale.getHeight(null) * scale); Image scaledImage = imageToScale.getScaledInstance( x, y, java.awt.Image.SCALE_SMOOTH); ImageIcon image = new ImageIcon(scaledImage); // 直接设置面板尺寸,不需要两次调用 this.setBounds(0, -4, image.getIconWidth(), image.getIconHeight()); map.setIcon(image); // 新增:给标签设置尺寸 map.setBounds(0, 0, image.getIconWidth(), image.getIconHeight()); this.add(map); } }
内容的提问来源于stack exchange,提问作者HygrowCarpets
相关产品推荐
相关产品推荐

