2013-08-19 84 views
4

可以從一個Graphics2D繪製到另一個Graphics2D將Graphics2D繪製到另一個Graphics2D

讓我解釋一下。 我有印刷問題,當我在屏幕上顯示JTextAreaJTextPanel時,內部使用其sun.java2d.SunGraphics2D,但是當我使用sun.print.PeekGraphicssun.awt.windows.WPathGraphics時。 問題在於某種字體,如Arial。在某些尺寸的線條被切割。 我已經嘗試了很多方法來在打印,Graphics2D.drawStringSwingUtilities2.drawStringTextLayout.drawString,但在某些情況下行仍然被剪切,或行不剪切,但某種理由使disapear空白的文字。

所以我的想法是嘗試渲染與sun.java2d.SunGraphics2D組件並通過sun.print.PeekGraphicssun.awt.windows.WPathGraphics將表面「複製」到打印機。

在此先感謝。

回答

1

是的,它是可能的,這是如何在許多Java遊戲中實現雙緩衝。你需要的是Graphics2D的drawImage()方法,它接受另一個Graphics2D對象的繪製。從我的一個小遊戲:

private Main(){ 
     ... 
     /* Create the backbuffer as a BufferedImage object */ 
     this.doubleBuffer = new BufferedImage(this.WIDTH, this.HEIGHT, BufferedImage.TYPE_INT_RGB); 
     /* create a Graphics 2D object to draw INTO this backbuffer */ 
     this.doubleBufferG2D = (Graphics2D) doubleBuffer.createGraphics(); 
     ... 
    } 

別的地方:

/*Now lets draw the backbuffer INTO the screen */ 
g2d.drawImage(doubleBuffer, null , 0, 0); 

編輯:嘿,我意識到它不完全如上...讓我想想就可以了。

編輯2:好吧上面仍然可以使用一個示例,但從一個Graphics2D繪製到另一個的步驟順序應如下: 1.使用drawGraphics()從Graphics2D對象映射到Image/BufferedImage對象。 。 2.從上面的Image/BufferedImage中,使用itscreateGraphics()提取其成員Graphics2D對象。

+0

Graphics2D.drawGraphics()不存在。 – Ezequiel

1

看起來你可以做兩件事情之一:從原來的Graphics2D

  • 的圖像上創建一個Graphics2D,做你的渲染,然後繪製圖像到另一個Graphics2D的

  • 或創建的Graphics2D使用Graphics.create()方法,然後進行渲染。

+0

我會放棄第一種方法。將矢量(字體)柵格化成圖像會導致精度損失,圖像也會消耗更多的內存。 請您舉例說明第二種方法? – Ezequiel

+0

我沒有這樣的例子 - 有一個答案所以,這是迄今爲止我發現的最好:http://stackoverflow.com/questions/14088613/graphics-how-do-i-use-the- method-createint-x-int-y-int-width-int-height-a。特別是,你需要做什麼是困難的。由於不同DPI的字體渲染有所不同,即使您做的都是正確的,在屏幕上顯示的內容可能會被打印出來,反之亦然。 〜20年前,我必須在Win API部門進入這個領域 - 這種持久的印象是它非常不平凡。 – Arkadiy