Java 从paintComponent中的BuffereImage始终为空

Java 从paintComponent中的BuffereImage始终为空,java,swing,jpanel,bufferedimage,paintcomponent,Java,Swing,Jpanel,Bufferedimage,Paintcomponent,我想使用2个图像(从文件加载后)创建FinalImage并显示它。所以我创建了一个类: public class ImagePanel extends JPanel{ private static final long serialVersionUID = 1L; private BufferedImage firstImage; private BufferedImage secondImage; private BufferedImage finalImage; public Image

我想使用2个图像(从文件加载后)创建FinalImage并显示它。所以我创建了一个类:

public class ImagePanel extends JPanel{

private static final long serialVersionUID = 1L;
private BufferedImage firstImage;
private BufferedImage secondImage;
private BufferedImage finalImage;

public ImagePanel(BufferedImage first, BufferedImage second){
    if(first != null && second != null){
        this.firstImage = deepCopy(first);
        this.secondImage = deepCopy(second);
        finalImage = new BufferedImage(firstImage.getWidth()*2, firstImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = finalImage.getGraphics();
        g.drawImage(firstImage, 0, 0, null);
        g.drawImage(secondImage, firstImage.getWidth(), 0, null);
        System.out.println("FinalImage"+finalImage.toString());
    }
}

private BufferedImage deepCopy(BufferedImage bi) {
     ColorModel cm = bi.getColorModel();
     boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
     WritableRaster raster = bi.copyData(null);
     return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}

protected void paintComponent(Graphics g) {
    super.paintComponents(g);
    if(finalImage != null){
        g.drawImage(finalImage, 20, 20, null);
    }
}
}
但是当我重新绘制()这个类时,finalImage中的值总是为null。 我使用了deepCopy,但是这个方法没有改变任何东西。 我还检查了toString方法给出了什么,并且一切都正常(它给出了最终图像的正常宽度和高度)

有人知道为什么null总是在paintComponent方法中给出


谢谢你的帮助:)

你的评论说明了你的问题。您有两个ImagPanel对象,一个显示并带有空图像,另一个未显示且带有非空图像

解决方案:仅创建一个对象。给它一个
setImages(Image img1,Image img2)
方法,并在需要设置图像时调用它


另外,根据我的评论,更改您的超级方法调用。

我想知道您的问题是否在未显示的代码中。也许您正在使用两个ImagePanel对象。也不要调用super的paintComponents方法,而是调用其paintComponent方法;在大型机和构造器中,我给imagePanel=newImagePanel(null,null)和next after(单击开始按钮)imagePanel=newImagePanel(img1,img2)。我确信img1和img2不是空的,你是对的。我使用(null,null)添加到JFrame面板,然后对其进行更改,使其不会绘制。