2009-08-28 29 views
13

JPanel(まだ表示されていない)をBufferedImageに変換する方法はありますか?あなたがする必要があるかもしれませんJPanelを画像に変換する

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); 
    return bi; 
} 

:あなたはJPanelの上で塗料を呼び出すために使用することができ、グラフィックスオブジェクト、のようなものを作成することができたBufferedImageから

おかげで、

ジェフ

+0

まあ、私はあきらめます。私はあなたが最後に2つの投稿に2つの答えを与えましたが、あなたはそれを無視しました。今後の投稿で幸運を祈る。 – camickr

+0

私は応答を感謝し、私はそれらを無視していない。この記事では、ScreenImageは私が探していたものではなく、他のグラフィックスにペイントするだけのこの方法が私にとって正しい方向に見えました。ダイアログボックスのポストでは、それは問題ではないことが判明し、私はすべてに返信していないので、私は泥沼になってしまった。私はあなたの回答に感謝します。 –

答えて

23

最初にパネルのサイズを設定してください。

+0

よかった、ありがとう。パネルのサイズを(おそらくその好ましいサイズ)にする必要があるかどうかを判断する方法はありますか? –

+0

私はそれが既にレンダリングされている限り、それが望ましいサイズ、または現在のサイズだと思います。それはまだレンダリングされていない場合は問題があります - 私は正確な詳細を覚えていないが、印刷システムを実装するときに同様のプロパティに実行されることを覚えています。 – aperkins

+0

希望のサイズはうまくいきますが、あなたが言ったように、パネルがまだ表示されていない場合はレンダリングされません。それを「レンダリング」する方法はありますか?それを画面に表示する方法はありますか?基本的には、イメージに書き込む必要があるが表示されないコンポーネントを構築しています。 –

2

基本的に私は、画像 に書き込ま取得する必要があるコンポーネント を構築するが、

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); 
    return bi; 
} 

private void layoutComponent(Component component) { 
    synchronized (component.getTreeLock()) { 
     component.doLayout(); 

     if (component instanceof Container) { 
      for (Component child : ((Container) component).getComponents()) { 
       layoutComponent(child); 
      } 
     } 
    } 
} 
0

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

0

Tomからの答えは基本的には正しいですが、paint()は同期呼び出しであり、スイングスレッド上の他の操作で中断する可能性があるため、直接呼び出さないでください。代わりに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); 
return bi; 
} 
1

を使用する必要があります。 JPanel.print()が優れています。 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.print(g); 
return bi; 
}