Java中使用g.drawImage()在JPanel无法显示PNG图片的问题
问题分析与解决方案
核心原因:方法名大小写错误
Swing 绘制 JPanel 的核心回调方法是**paintComponent(Graphics g)**(注意首字母为小写p),而你的代码中写成了PaintComponent(Graphics g)(首字母大写P)。Java 是大小写敏感语言,这个错误导致 Swing 的绘制系统不会调用你写的绘制逻辑,fillRect 和 drawImage 代码根本没有执行,自然看不到任何图形或图片。
修正后的代码
将方法名改为正确的paintComponent,建议加上@Override注解,避免此类大小写错误:
package main; import java.io.InputStream; import java.awt.Dimension; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class GamePanel extends JPanel{ private BufferedImage img, subImg; private float xDelta = 0, yDelta = 0; public GamePanel() { importImg(); setPanelSize(); } public void importImg() { InputStream is = getClass().getResourceAsStream("/TetrisBlocksTextureAtlas.png"); if (is == null) { System.err.println("图片资源未找到,请检查路径"); return; } try { img = ImageIO.read(is); } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } public void setPanelSize() { Dimension size = new Dimension(200, 400); setPreferredSize(size); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.fillRect(0, 0, 50, 50); if (img != null) { g.drawImage(img, 0, 0, null); } } }
额外检查项
- 图片资源路径验证:
/TetrisBlocksTextureAtlas.png表示图片需放在项目的根类路径下(如 Maven 项目的src/main/resources目录,普通项目的src根目录),确保文件存在且路径无误。 - 窗口添加逻辑:确保
GamePanel被正确添加到JFrame并显示,示例启动代码:
import javax.swing.JFrame; public class Main { public static void main(String[] args) { JFrame frame = new JFrame("测试窗口"); frame.add(new GamePanel()); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
内容的提问来源于stack exchange,提问作者goldern
相关产品推荐
相关产品推荐

