2009-08-28 444 views
13

有沒有辦法將JPanel(尚未顯示)轉換爲BufferedImage?將JPanel轉換爲圖像

感謝,

傑夫

+0

好吧,我放棄了。我在最後兩個帖子中給出了兩個答案,你完全忽略了。祝你今後發佈好運。 – camickr 2009-08-29 01:02:45

+0

我很欣賞這些迴應,我一直沒有忽視它們。在這篇文章中,ScreenImage並不是我正在尋找的東西,而這種僅僅繪製到其他圖形上的方法對我來說似乎是正確的方向。在對話框的帖子中,它變成了一個非問題,我一直在淹沒,所以我沒有回覆所有的東西。我很欣賞你的迴應。 – 2009-08-29 15:59:38

回答

23

從您可以創建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; 
} 

您可能需要確保先設置面板的大小。

+0

不錯,謝謝。有沒有一種方法可以找出面板尺寸應該是什麼(可能是它的首選尺寸)? – 2009-08-28 20:49:26

+0

我相信這是首選尺寸或當前尺寸,只要它已經被渲染。如果它還沒有被渲染就會出現問題 - 我不記得確切的細節,但我記得在實現打印系統時遇到類似的屬性。 – aperkins 2009-08-28 20:59:46

+0

是的,首選大小的作品,但正如你所說,如果面板沒有顯示,它不呈現,這並沒有真正幫助我太多。有沒有辦法「渲染」它,但不顯示在屏幕上?基本上我正在構建一個組件,需要寫入圖像但不顯示。 – 2009-08-28 21:09:12

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

湯姆的回答基本上是正確的,但不建議直接調用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; 
}