ImageIcon.paintIcon 不在 JPanel 上绘制图像

ImageIcon.paintIcon does not draw image on JPanel

我正在尝试在 JPanel 上绘制 .png。我使用 ImageIcon 构造函数导入它,并在我的自定义面板的 paintComponent.

中绘制它

我的sscce:

package mypackage;

import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyPanel extends JPanel {

    static JFrame frame;
    static MyPanel panel;
    static ImageIcon icon;

    public static void main(String[] args) {
        icon = new ImageIcon(MyPanel.class.getResource("MyImage.png"));
        frame = new JFrame();
        panel = new MyPanel();
        frame.setSize(500, 500);
        frame.add(panel);
        frame.setVisible(true);
        frame.repaint();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        icon.paintIcon(panel, g, 100, 100);
    }
}

我希望图像(只是白色背景上的几个形状)显示在面板上的 (100, 100) 处。相反,一个空白屏幕:

没有错误发生意味着程序正在正确找到文件。

图像在我的 Eclipse 项目中,与 class:

在同一个包中

为什么会这样?我该如何解决?

由于代码看起来正确,我建议资源加载不正确。

将 png 文件放在类路径中。例如。我会有一个目录:

~/ProjectRoot/resources/mypackage/

然后在类路径中包含资源。 In eclipse you can setup the classpath via

Project -> Properties -> Java Build Path -> Add Class Folder

BufferedImage img = 
    ImageIO.read(MyPanel.class.getResourceAsStream("MyImage.png"));

如果找不到图像,则会引发异常。你可以用它来制作一个ImageIcon。

当您使用 ImageIcon 从文件中读取图像时,您不会得到读取是否成功的指示。

这是我使用 ImageIO 读取图像的 GUI:

这是图像,与 Java 源位于同一目录中:

这是您的代码,其中我使用 ImageIO 读取来读取图像,并在 paintComponent 方法中绘制图像。

package com.ggl.testing;

import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MyPanel extends JPanel {

    private static final long serialVersionUID = -9008812738915944216L;

    private static JFrame frame;
    private static MyPanel panel;
    private static Image image;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                image = getImage();
                frame = new JFrame();
                panel = new MyPanel();
                frame.setSize(500, 500);
                frame.add(panel);
                frame.setVisible(true);
            }
        });
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 100, 100, MyPanel.this);
    }

    private static Image getImage() {
        Image image = null;
        try {
            image = ImageIO.read(MyPanel.class.getResource("maze.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return image;
    }
}