2017-04-02 31 views
0

我有一個使用Graphic2D顯示圖形的JPanel。這工作正常。我現在想要將圖形保存到文件中。到目前爲止,我能做到這一點的唯一方法是創建一個BufferedImage,並將所寫的所有內容寫入JPanels Graphic2D對象,然後寫入屬於BufferedImage的Graphic2D對象,然後從BufferedImage執行PrintAll。 所以我有類似下面的代碼:有沒有辦法複製一個JPanel的Graphic2D實例來爲一個BufferedImage創建一個Graphic2D?

g.setFont(g.getFont().deriveFont(fontSize)); 
    g.drawString(text, xPos, yPos); 
    g.setFont(saveFont); 
    bG.setFont(g.getFont().deriveFont(fontSize)); 
    bG.drawString(text, xPos, yPos); 
    bG.setFont(saveFont); 

其中g是JPanel的 的Graphic2D對象和BG是的BufferedImage的

的Graphic2D對象當然這不可能是做的最好的辦法這個。有沒有使用屬於JPanel的Graphic2D對象爲BufferedImage生成Graphic2D對象的方法?

+0

太好了!這應該不是一個評論的答案。 –

回答

0

我會提取一種方法,例如paintGraph(Graphics2D g)繪製圖。然後你從兩個地方調用它。一旦從您的JPanelpaintComponent(..)方法,並在您的「saveToFile」方法一次,使用您的BufferedImageGraphics2D實例。

如果您的圖形繪製代碼可調整大小,您可能需要一個Dimension作爲您的方法的第二個參數,它是面板的大小或圖像的大小。

在代碼:

void paintGraph(Graphics2D g, Dimension size) { 
    g.setFont(g.getFont().deriveFont(fontSize)); 
    g.drawString(text, xPos, yPos); 
    g.setFont(saveFont); 
    // ...etc 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    paintGraph((Graphics2D) g, getSize()); 
} 

void saveToFile(File f) { 
    BufferedImage image = new BufferedImage(512, 512, BufferedImage.TYPE_INT_ARGB); 

    Graphics2D g = image.createGaphics(); 
    paintGraph(g, new Dimension(image.getWidth(), image.getHeight()); 
    g.dispose(); 

    ImageIO.write(image, "PNG", f); 
} 
相關問題