如何导出图像而不在JavaSwing中显示

如何导出图像而不在JavaSwing中显示,java,swing,export,png,Java,Swing,Export,Png,我有以下代码的问题(它是简化的测试版本): 我想做的就是将JPanel背景导出为png文件,而不显示框架。问题是,现在它可以工作了,但如果我评论行: frame.setVisible(true) 所有我得到的是png文件都是黑色的,大小合适 如果setVisible为false,我发现组件没有正确绘制,我在互联网上查看了一下,但凭借我对swing的短暂经验,我发现没有任何东西可以工作。也许这里有人能帮忙 解决方案 使用函数pack()创建具有大小的组件,使用函数dispose()完成swing的

我有以下代码的问题(它是简化的测试版本):

我想做的就是将JPanel背景导出为png文件,而不显示框架。问题是,现在它可以工作了,但如果我评论行:

frame.setVisible(true)

所有我得到的是png文件都是黑色的,大小合适

如果setVisible为false,我发现组件没有正确绘制,我在互联网上查看了一下,但凭借我对swing的短暂经验,我发现没有任何东西可以工作。也许这里有人能帮忙

解决方案

使用函数pack()创建具有大小的组件,使用函数dispose()完成swing的循环

public void getImage() {
    frame.pack();
    BufferedImage img = new BufferedImage(1000, 600, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = img.createGraphics();
    background.paint(g2d);
    g2d.dispose();
    try {
        ImageIO.write(img, "png", new File("frame_2.png"));
    } catch(Exception e) {
        e.printStackTrace();
    }
    frame.dispose();
}

Swing组件只有在打包()框架或在框架上调用setVisible(true)时才有大小,因为尚未调用布局管理器

因此,在调用getImage()方法之前,请尝试调用pack()


您还可以尝试使用,这是一个可重用的类,允许您创建桌面、框架或框架上任何组件的图像。它将自动处理设置组件的大小,即使组件在帧上还不可见。

您想知道为什么setVisible(true)会按预期显示png,如果为false,则会显示所有黑色??不完全是-当我设置了setVisible(true)时,我会看到整个帧,我会使用getImage()方法导出背景JPanel,创建了frame_2.png文件,我在那里看到了与JFrame中相同的图像(三个矩形-黑色、白色和蓝色)。我不想让JFrame出现,但我还是想让这个png文件包含JFrame的内容。现在,如果我添加setVisible(false),将创建png文件,但它是黑色的。您是否只想创建一些图像并保存它?或者您想保存Swing GUI的屏幕截图而不需要首先在屏幕上显示它吗?是的,简而言之,我想保存Swing GUI的屏幕截图而不需要首先在屏幕上显示它在background.paint(g2d)之前添加frame.pack();使程序永远不会结束,所以里面一定有一些无休止的循环,但感谢您的回复,我将尝试屏幕图像。一旦启动Swing应用程序,事件调度线程就会启动。EDT正在等待用户事件。由于您从未使框架可见,因此无法看到允许您关闭它的框架。因此,在调用getImage()方法后,您应该能够添加一个
frame.dispose()
。这将关闭机架并允许EDT终止。
public void getImage() {
    frame.pack();
    BufferedImage img = new BufferedImage(1000, 600, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = img.createGraphics();
    background.paint(g2d);
    g2d.dispose();
    try {
        ImageIO.write(img, "png", new File("frame_2.png"));
    } catch(Exception e) {
        e.printStackTrace();
    }
    frame.dispose();
}