【问题标题】:Convert JPanel to image将 JPanel 转换为图像
【发布时间】:2010-11-23 20:50:30
【问题描述】:

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

谢谢,

杰夫

【问题讨论】:

  • 好吧,我放弃了。在您完全忽略的最后两个帖子中,我给了您两个答案。祝你以后的帖子好运。
  • 我很欣赏这些回复,我并没有忽略它们。在这篇文章中,ScreenImage 并不是我想要的,而这种仅在其他图形上绘画的方法对我来说似乎是正确的方向。在对话框帖子上,结果证明这不是问题,我已经被淹没了,所以我没有回复所有内容。非常感谢您的回复。

标签: java image swing jpanel


【解决方案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。单元格渲染器在图像上绘制而不显示,然后在可见的表格组件上绘制。

      【讨论】:

        猜你喜欢
        • 2013-01-11
        • 2011-09-11
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        相关资源
        最近更新 更多