将JPanel转换为图像

有没有办法将JPanel(尚未显示)转换为BufferedImage?

谢谢,

杰夫

从BufferedImage可以创建一个图形对象,您可以使用它在JPanel上调用paint,如:

public BufferedImage createImage(JPanel panel) { int w = panel.getWidth(); int h = panel.getHeight(); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); panel.paint(g); g.dispose(); return bi; } 

您可能需要确保先设置面板的大小。

基本上我正在构建一个需要写入图像但不显示的组件

ScreenImage解释了如何做你想做的事。


ScreenImage.java的相关部分(略有编辑)。 layoutComponent强制所有按钮出现在图像中。

 /** * @return Renders argument onto a new BufferedImage */ public BufferedImage createImage(JPanel panel, int width, int height) { BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); Graphics2D g = bi.createGraphics(); panel.setSize(width, height); // or panel.getPreferedSize() layoutComponent(panel); panel.print(g); g.dispose(); return bi; } private void layoutComponent(Component component) { synchronized (component.getTreeLock()) { component.doLayout(); if (component instanceof Container) { for (Component child : ((Container) component).getComponents()) { layoutComponent(child); } } } } 

我同意。 JPanel.print()更好。 JPanel.paint()导致我的应用程序出错。

 public BufferedImage createImage(JPanel panel) { int w = panel.getWidth(); int h = panel.getHeight(); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); panel.print(g); return bi; } 

Tom的答案基本上是正确的,但不推荐直接调用paint() ,因为它是一个同步调用,并且可以在swing线程上用其他操作中断。 我们应该使用print()来代替使用paint()

 public BufferedImage createImage(JPanel panel) { int w = panel.getWidth(); int h = panel.getHeight(); BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); panel.print(g); g.dispose(); return bi; } 

看看BasicTableUI。 单元格渲染器在图像上绘制而不显示,然后在可见表格组件上绘制。