2

私たちの企業では、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() も試しましたが、これは少なくとも機能しますが、メニュー バーは描画されません。

誰かがこのトピックについてもっと知っていますか?

4

0 に答える 0