Component
paintAll(Graphics)
(すでに見つけたように)メソッドがあります。そのメソッドは、渡されたグラフィックにそれ自体をペイントします。ただし、paintメソッドを呼び出す前に、グラフィックを事前に構成する必要があります。これが、 java.sun.comでのAWTコンポーネントのレンダリングについて私が見つけたものです。
AWTがこのメソッドを呼び出すと、Graphicsオブジェクトのパラメーターは、この特定のコンポーネントを描画するための適切な状態で事前構成されます。
- Graphicsオブジェクトの色は、コンポーネントのフォアグラウンドプロパティに設定されます。
- Graphicsオブジェクトのフォントは、コンポーネントのfontプロパティに設定されます。
- Graphicsオブジェクトの移動は、座標(0,0)がコンポーネントの左上隅を表すように設定されます。
- Graphicsオブジェクトのクリップ長方形は、再描画が必要なコンポーネントの領域に設定されます。
したがって、これが結果のメソッドです。
public static BufferedImage componentToImage(Component component, Rectangle region)
{
BufferedImage img = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
Graphics g = img.getGraphics();
g.setColor(component.getForeground());
g.setFont(component.getFont());
component.paintAll(g);
g.dispose();
if (region == null)
{
return img;
}
return img.getSubimage(region.x, region.y, region.width, region.height);
}
これは、表示されているコンポーネントに使用する代わりに、より良い方法でもありRobot
ます。
編集:
ずっと前に、ここに投稿したコードを使用しましたが、機能しましたが、現在は機能していません。それで私はさらに検索しました。私はテストされた、動作する方法を持っています。汚れていますが、動作します。そのアイデアは、JDialogを作成し、画面の境界の外に配置し、表示するように設定してから、グラフィックに描画することです。
コードは次のとおりです。
public static BufferedImage componentToImageWithSwing(Component component, Rectangle region) {
BufferedImage img = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics g = img.createGraphics();
// Real render
if (component.getPreferredSize().height == 0 && component.getPreferredSize().width == 0)
{
component.setPreferredSize(component.getSize());
}
JDialog f = new JDialog();
JPanel p = new JPanel();
p.add(component);
f.add(p);
f.pack();
f.setLocation(-f.getWidth() - 10, -f.getHeight() -10);
f.setVisible(true);
p.paintAll(g);
f.dispose();
// ---
g.dispose();
if (region == null) {
return img;
}
return img.getSubimage(region.x, region.y, region.width, region.height);
}
したがって、これはWindowsとMacでも機能します。もう1つの答えは、仮想画面に描画することでした。しかし、これはそれを必要としません。