有没有一种方法,以一个JPanel(即尚未显示)转换成一个BufferedImage?
谢谢,
杰夫
有没有一种方法,以一个JPanel(即尚未显示)转换成一个BufferedImage?
谢谢,
杰夫
从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;
}
您可能需要确保您先设置面板的大小。
基本上我构建需要得到写入到的图像,但不显示组件
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);
}
}
}
}
从汤姆的回答基本上是正确的,但调用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;
}
看看BasicTableUI。 细胞渲染器没有显示,然后在可见表组件上绘制图像绘制。