我有下面的probelm代码(它是简化的测试版本):
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
public class Example {
JFrame frame;
JPanel background;
JPanel top;
JPanel center;
JPanel bottom;
public Example() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1016, 639);
frame.setResizable(false);
background = new JPanel();
background.setLayout(new BoxLayout(background, BoxLayout.Y_AXIS));
background.setPreferredSize(new Dimension(1000, 200));
top = new JPanel();
top.setPreferredSize(new Dimension(1000, 200));
top.setBackground(Color.BLACK);
center = new JPanel();
center.setPreferredSize(new Dimension(1000, 200));
center.setBackground(Color.WHITE);
bottom = new JPanel();
bottom.setPreferredSize(new Dimension(1000, 200));
bottom.setBackground(Color.BLUE);
background.add(top);
background.add(center);
background.add(bottom);
frame.add(background);
frame.setVisible(true);
}
public void getImage() {
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();
}
}
public static void main(String... args) {
Example ex = new Example();
ex.getImage();
}
}
我想做的只是将JPanel后台导出为png文件,而不显示框架。 问题是,现在它是有效的,但如果我注释行:
Frame.SetVisible(true);
所有我得到的是全黑的png文件,与正确的大小。
如果setVisible是false,我认为组件没有被正确地绘制,我在互联网上查看了一下,但是根据我使用swing的短暂经验,我没有发现任何工作的东西。 也许这里有人能帮忙?
Swing组件没有大小,除非您将框架打包()或在框架上调用setVisible(true),因为还没有调用布局管理器。
因此,在调用getImage()方法之前,尝试调用pack()。
您还可以尝试使用Screen Image,它是一个可重用的类,允许您创建桌面,框架或框架上任何组件的图像。 它将自动处理组件大小的设置,即使它们在框架上还不可见。