将 JPanel 转换为图像
Posted
技术标签:
【中文标题】将 JPanel 转换为图像【英文标题】:Convert JPanel to image 【发布时间】:2010-11-23 20:50:30 【问题描述】:有没有办法将 JPanel(尚未显示)转换为 BufferedImage?
谢谢,
杰夫
【问题讨论】:
好吧,我放弃了。在您完全忽略的最后两个帖子中,我给了您两个答案。祝你以后的帖子好运。 我很欣赏这些回复,我并没有忽略它们。在这篇文章中,ScreenImage 并不是我想要的,而这种仅在其他图形上绘画的方法对我来说似乎是正确的方向。在对话框帖子上,结果证明这不是问题,我已经被淹没了,所以我没有回复所有内容。非常感谢您的回复。 【参考方案1】:您可以从 BufferedImage 创建一个图形对象,您可以使用它在 JPanel 上调用绘画,例如:
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;
您可能需要确保先设置面板的大小。
【讨论】:
很好,谢谢。有没有办法我可以弄清楚面板尺寸应该是多少(也许是它的首选尺寸)? 我相信它是首选尺寸或当前尺寸,只要它已经被渲染。如果它还没有被渲染,就会出现问题——我不记得确切的细节,但我记得在实现打印系统时遇到了类似的属性。 是的,首选尺寸有效,但正如您所说,如果面板尚未显示,它不会呈现,这对我并没有太大帮助。有没有办法“渲染”它但不在屏幕上显示?基本上我正在构建一个需要写入图像但不显示的组件。 嗯..如果组件尚未显示,printAll 仍然无法工作。 @JeffStorey 你是如何让面板上的东西在创建的图像中可见的??【参考方案2】:基本上我正在构建一个组件 需要写入图像 但不显示
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);
【讨论】:
【参考方案3】:Tom的回答基本正确,但不建议直接调用paint()
,因为它是同步调用,可以中断swing线程上的其他操作。与其使用paint()
,不如使用print()
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;
【讨论】:
【参考方案4】:看看 BasicTableUI。单元格渲染器在图像上绘制而不显示,然后在可见的表格组件上绘制。
【讨论】:
以上是关于将 JPanel 转换为图像的主要内容,如果未能解决你的问题,请参考以下文章