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ます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 に答える