Java repaint() 不调用 paintComponent() 来绘制图像

Java repaint() doesn't call paintComponent() for drawing image

我已经阅读了很多关于这个问题的答案,但即使是在简单的代码上我也无法找到我的错误。问题是:我想在 JPanel 中的 JLabel 中绘制图像,但未调用 JLabel 的 paintComponent() 方法。

这是代码:

ImagePainter class 应该绘制图像

public class ImagePainter extends JLabel{
    private Image image;

    public ImagePainter(){
        try {
            image = ImageIO.read(new File("src/testgui/image.png"));
        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
        System.out.println("in paintComponent");
    }
}

这是一个标准的JFrame。我注意将 JPanel 添加到 contentPane

public class Display extends JFrame{

    public Display(){
        JPanel jp = new JPanel();
        ImagePainter i = new ImagePainter();

        getContentPane().add(jp);
        jp.add(i);
        jp.repaint();

        setSize(800, 800);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
}

最后是主线。我像每个人告诉的那样在 EDT 上实例化显示 :

public class Main {

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            @Override
            public void run(){
                Display d = new Display();
            }
        });
    }

}

最后,我观察到如果我直接将ImagePainter添加到contentPane中,图像绘制正确。这可能是一个愚蠢的错误,但我花了几个小时试图找到它,但真的看不到它。提前致谢!

自定义绘制图片时标签不考虑图片的首选尺寸!默认情况下,面板具有流式布局。流式布局不会拉伸组件以适应。因此该标签的大小为 0 x 0 像素。您可以通过向标签添加可见边框来确认这一点。

但是既然图像显示在标签中,为什么不直接将图像设置为标签的图标呢?

此外,Display 构造函数中的 jp.repaint() 语句没有用,因为您尚未将框架设置为可见。