17

JPanel (まだ表示されていない) を BufferedImage に変換する方法はありますか?

ありがとう、

ジェフ

4

4 に答える 4

33

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;
}

最初にパネルのサイズを設定する必要がある場合があります。

于 2009-08-28T20:46:06.990 に答える
4

基本的に、画像に書き込む必要があるが表示されないコンポーネントを作成しています

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);
            }
        }
    }
}
于 2009-08-28T21:28:58.200 に答える
3

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;
}
于 2013-09-03T04:57:33.473 に答える
0

BasicTableUI を見てください。セルレンダラーは、表示せずに画像に描画され、次に可視テーブルコンポーネントに描画されます。

于 2009-08-29T06:31:21.137 に答える