Java:将基于另一个图形对象的新图形对象导出为PNG

Java:将基于另一个图形对象的新图形对象导出为PNG,java,swing,graphics,save,bufferedimage,Java,Swing,Graphics,Save,Bufferedimage,我一直在尝试导出图形对象的图像 这是该方法的外观: private BufferedImage paintImage; public void paint(Graphics g){ super.paint(g); paintImage = new BufferedImage(500, 600, BufferedImage.TYPE_INT_ARGB); Graphics2D statsExGraphics = paintImage.createGraphics

我一直在尝试导出图形对象的图像

这是该方法的外观:

    private BufferedImage paintImage;

public void paint(Graphics g){
    super.paint(g);

    paintImage = new BufferedImage(500, 600, BufferedImage.TYPE_INT_ARGB);
    Graphics2D statsExGraphics = paintImage.createGraphics();
    imageText.paint(statsExGraphics);

    try{
        ImageIO.write(paintImage, "PNG", new File("src/statsexport2.png"));
    }catch(IOException e){
        e.printStackTrace();
    }

    map.paint(g);
    imageText.paint(g);

    switch (backgroundState) {
        case 1: 
            grid.paintItems(g);
            penguin.paint(g);
            purpleBear.paint(g);
            blueBear.paint(g);
            break;
        case 2: 
            EndgameGraphics done = new EndgameGraphics(endCondition);
            done.run();
            break;
        default: System.out.println("Error invalid background");
    }
}
我会将g对象强制转换到Graphics2D对象上,但是BuffereImage对象不会连接到图形

我需要全部导出对象,以便在游戏结束时将其重新显示到面板上。done(EndgameGraphics对象)是生成一个新JFrame的代码,其中包含一个背景图像和一个按钮,我需要将imageText图形对象重新插入到这个新JFrame中。在EndgameGraphics中,我处理了包含上述方法中最初绘制的所有内容的JFrame,并实例化了一个新的JFrame

我在想这句话

imageText.paint(statsExGraphics);
不是一个执行了我要寻找的逻辑的语句,我不确定从这里走到哪里

当前代码正在生成一个空白图像。是否有Graphics2D的方法可以接受Graphics的参数并将其绘制到Graphics2D对象上

也许有另一种方法可以复制这个图形对象,并在EndgameGraphics中重新创建它,以添加到新的JFrame中


非常感谢您的帮助。

我假设
imageText
是某种组件,如果是这样,您应该使用
print
printAll
not
paint
-另外,永远不要引用
src
,一旦导出应用程序,它就不存在了,不要在paint方法中执行IO,这将严重降低应用程序的性能基于我掌握的有限信息,我建议您不要使用
paint
(您应该使用
paintComponent
,但我暂时不谈这一点)在游戏循环的更新阶段,将状态绘制为
BufferedImage
,在绘制方法中使用此选项,而不是如何将状态绘制到BuffereImage?我的印象是“imageText.paint(statsExGraphics);”正在这样做?好吧,基本上,您不需要使用
paint
,而是在主循环中创建一个
BuffereImage
并使用它的
Graphics
上下文来渲染当前状态,然后在
paint
方法中绘制此图像。这意味着您已经拥有了想要使用的映像—这是一个双缓冲的原始示例