5

可以从一个画Graphics2D到另一个Graphics2D吗?

让我解释。我有打印问题,当我在屏幕上显示 a JTextAreaorJTextPanel时,它在内部使用了sun.java2d.SunGraphics2D,但是当我打印它时使用sun.print.PeekGraphicsand sun.awt.windows.WPathGraphics。问题出在某种字体上,比如 Arial。在某些尺寸中,线条被切割。我已经尝试了很多方法来在打印中渲染文本,, Graphics2D.drawString, SwingUtilities2.drawString, TextLayout.drawString,但在某些情况下,线条仍然被剪切,或者线条没有被剪切,但某种理由使空白消失。

所以我的想法是尝试使用 sun.java2d.SunGraphics2D 渲染组件并通过sun.print.PeekGraphicsor将表面“复制”到打印机sun.awt.windows.WPathGraphics

提前致谢。

4

2 回答 2

2

是的,有可能,这就是在许多 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);

编辑:呵呵,我意识到它并不完全像上面那样......让我想想。

Edit2:好吧,上面仍然可以用作示例,但是从一个 Graphics2D 绘制到另一个的步骤顺序应该是这样的: 1. 使用 drawGraphics() 从一个 Graphics2D 对象到一个 Image/BufferedImage 对象。2. 从上面的 Image/BufferedImage 中,使用 itscreateGraphics() 提取其成员 Graphics2D 对象。

于 2013-08-19T14:11:44.257 回答
2

看起来你可以做以下两件事之一:

  • 在图像上创建 Graphics2D,进行渲染,然后将图像绘制到另一个 Graphics2D

  • 或使用 Graphics.create() 方法从原始 Graphics2D 创建 Graphics2D,然后进行渲染。

于 2015-06-30T19:36:10.257 回答