将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。 单元格渲染器在图像上绘制而不显示,然后在可见表格组件上绘制。