有没有办法将 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);
}
}
}
}
Tom的回答基本正确,但paint()
不推荐直接invoke,因为它是同步调用,可以中断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;
}
看看 BasicTableUI。单元格渲染器在不显示的情况下绘制在图像上,然后绘制在可见的表格组件上。