获取JPanel的图像

时间:2011-12-01 18:55:25

标签: image swing jpanel bufferedimage java-3d

我在从屏幕外JPanel创建BufferedImage时遇到问题。具体来说,我正在尝试绘制JPanel(包含一些Java3D元素)的图像作为我正在处理的应用程序的背景图像。

我发现了几个线程,描述了如何通过将JPanel绘制到BufferedImage的图形上下文来获取JPanel的图像,但是当我绘制BufferedImage时,我得到的只是一个大的白色矩形。

这是我的代码:

SimpleWorld j3DPanel; // a custom JPanel that contains some simple Java3D elements

// CONSTRUCTOR

public GameBackgroundObject()
{
    super();

    // Here I set up a JPanel that contains some Java3D elements.

    j3DPanel = new SimpleWorld();
    j3DPanel.setSize(mainLevel.SCREENW, mainLevel.SCREENH);
    j3DPanel.setBounds(0,0,mainLevel.SCREENW, mainLevel.SCREENH);
    j3DPanel.doLayout();
    j3DPanel.validate();
} 


protected void draw(Graphics2D parentComponentGraphics, ...)
{
    super.draw(parentComponentGraphics, ...);

    int w = j3DPanel.getWidth();
    int h = j3DPanel.getHeight();

    BufferedImage j3DImg = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = j3DImg.createGraphics();
    j3DPanel.paint(g);

    parentComponentGraphics.drawImage(j3DImg, null, null);

}

另外,我尝试将我的JPanel添加到JFrame的内容中。它在那里工作并正确显示渲染的Java3D元素。但是,每当我尝试获取JPanel的BufferedImage并绘制该图像时,我就会得到这个大的白色矩形。

2 个答案:

答案 0 :(得分:1)

绘制Java 3D场景可能会失败,因为它的Canvas3D组件是重量级的。使用轻量级面板“com.sun.j3d.exp.swing.JCanvas3D”可能会解决此问题。它的使用有点棘手。请参阅相应的Java 3D示例'JCanvas3DExample'或尝试其中一个派生作品http://www.interactivemesh.org/testspace/j3dmeetsswing.html#leightweight

答案 1 :(得分:0)

尝试致电:

j3DPanel.paintComponent(g);

而不是:

j3DPanel.paint(g);