JPanel (まだ表示されていない) を BufferedImage に変換する方法はありますか?
ありがとう、
ジェフ
BufferedImageから、次のようなグラフィックスオブジェクトを作成できます。これを使用して、JPanelでpaintを呼び出すことができます。
public BufferedImage createImage(JPanel panel) {
int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.paint(g);
g.dispose();
return bi;
}
最初にパネルのサイズを設定する必要がある場合があります。
基本的に、画像に書き込む必要があるが表示されないコンポーネントを作成しています
ScreenImageはあなたが望むことをする方法を説明します。
ScreenImage.javaの関連セクション(少し編集)。layoutComponent
すべてのボタンを画像に強制的に表示します。
/**
* @return Renders argument onto a new BufferedImage
*/
public BufferedImage createImage(JPanel panel, int width, int height) {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
panel.setSize(width, height); // or panel.getPreferedSize()
layoutComponent(panel);
panel.print(g);
g.dispose();
return bi;
}
private void layoutComponent(Component component) {
synchronized (component.getTreeLock()) {
component.doLayout();
if (component instanceof Container) {
for (Component child : ((Container) component).getComponents()) {
layoutComponent(child);
}
}
}
}
Tom からの回答は基本的に正しいですが、paint()
直接呼び出しは同期呼び出しであり、swing スレッドの他の操作に割り込む可能性があるため、お勧めしません。を使用する代わりに、代わりに使用paint()
する必要がありますprint()
public BufferedImage createImage(JPanel panel) {
int w = panel.getWidth();
int h = panel.getHeight();
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
panel.print(g);
g.dispose();
return bi;
}
BasicTableUI を見てください。セルレンダラーは、表示せずに画像に描画され、次に可視テーブルコンポーネントに描画されます。