17

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

谢谢,

杰夫

4

4 回答 4

33

从 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;
}

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

于 2009-08-28T20:46:06.990 回答
4

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

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);
            }
        }
    }
}
于 2009-08-28T21:28:58.200 回答
3

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;
}
于 2013-09-03T04:57:33.473 回答
0

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

于 2009-08-29T06:31:21.137 回答