私たちの企業では、JFrame.paintAll() を使用して、独自の (オープンソース) アプリケーションのスクリーンショットを作成しています。残念ながら、これは Windows と Mac OS でのみ機能しますが、Linux では機能しません。
ドイツのフォーラムで、SSCCE を見つけました。
public class SSCCEPaint
{
public static void main(String[] args) {
//create a simple JFrame
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.setVisible(true);
//craate an image to draw
BufferedImage img = new BufferedImage(300,300, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, 300, 300);
//paint the whole JFrame on the picture
frame.paintAll(g);
//Show the picture in a second frame
JFrame frame2 = new JFrame("Picture");
frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame2.add(new JScrollPane(new JLabel(new ImageIcon(img))));
frame2.setSize(300,300);
frame2.setLocation(200,0);
frame2.setVisible(true);
}
}
この SSCCE は、フォーラムの人たちによるとうまくいっているようですが、作者は自分のフレームを境界線でペイントしたいと考えています。したがって、彼は最終的に JFrame.printAll() を使用します。ところで、printAll() は私のマシンで動作しますが、境界線のないスクリーン ショットが必要です。
Robot クラスの回避策もすでに書いていますが、paintAll() メソッドほど洗練されていません。したがって、私は paintAll() ソリューションを好みます。frame.getContentPane().paintAll() も試しましたが、これは少なくとも機能しますが、メニュー バーは描画されません。
誰かがこのトピックについてもっと知っていますか?