5

我正在尝试将 JFrame 渲染到图像而不显示 JFrame 本身(类似于这个问题所问的)。我试过使用这段代码:

private static BufferedImage getScreenShot(Component component)
{
    BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
    // call the Component's paint method, using
    // the Graphics object of the image.
    component.paint(image.getGraphics());
    return image;
}

但是,这仅在设置了JFrame's时才有效setVisible(true)。这将导致图像显示在屏幕上,这不是我想要的。我也尝试过创建类似的东西:

public class MyFrame extends JFrame
{
    private BufferedImage bi;

    public MyFrame(String name, BufferedImage bi)
    { 
         this.bi = bi;
         super(name);
    }

    @Override
    public void paint(Graphics g)
    {
         g.drawImage(this.bufferedImage, 0, 0, null);
    }
}

但是,这会显示黑色图像(如上面的代码)。我很确定我所追求的是可能的,问题是我真的找不到方法。我对自定义 Swing 组件的经验非常有限,因此我们将不胜感激。

谢谢。

4

2 回答 2

10

这是一个应该可以解决问题的片段:

Component c; // the component you would like to print to a BufferedImage
JFrame frame = new JFrame();
frame.setBackground(Color.WHITE);
frame.setUndecorated(true);
frame.getContentPane().add(c);
frame.pack();
BufferedImage bi = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics = bi.createGraphics();
c.print(graphics);
graphics.dispose();
frame.dispose();
于 2012-09-18T13:36:39.983 回答
3

这种方法可能会奏效:

public BufferedImage getImage(Component c) {
    BufferedImage bi = null;
    try {
        bi = new BufferedImage(c.getWidth(),c.getHeight(), BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d =bi.createGraphics();
        c.print(g2d);
        g2d.dispose();
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
    return bi;
}

然后你会做类似的事情:

JFrame frame=...;
...
BufferedImage bImg=new ClassName().getImage(frame);
//bImg is now a screen shot of your frame
于 2012-09-18T15:14:42.947 回答