转换的JPanel图像(Convert JPanel to image)

2019-07-04 00:31发布

有没有一种方法,以一个JPanel(即尚未显示)转换成一个BufferedImage?

谢谢,

杰夫

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

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



Answer 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);
            }
        }
    }
}


Answer 3:

从汤姆的回答基本上是正确的,但调用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;
}


Answer 4:

看看BasicTableUI。 细胞渲染器没有显示,然后在可见表组件上绘制图像绘制。



文章来源: Convert JPanel to image