所有类


java.awt
类 Graphics2D

java.lang.Object
  继承者 java.awt.Graphics
      继承者 java.awt.Graphics2D

public abstract class Graphics2D
   
   
   
   
   
extends Graphics

Graphics2D 类扩展了 Graphics 类,提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。

坐标空间

所有传递到 Graphics2D 对象的坐标都在一个与设备无关并且名为用户空间的坐标系统中指定的,这是应用程序使用的坐标系统。Graphics2D 对象包含一个 AffineTransform 对象作为其呈现状态的一部分,后者定义了如何将坐标从用户空间转换到设备空间中与设备相关的坐标。

设备空间中的坐标通常是指单独的设备像素,并根据这些像素之间无限小的间距对齐。某些 Graphics2D 对象可用于将对存储器的呈现操作捕获到图形元文件中,用于以后在未知物理分辨率的具体设备上播放。由于在捕获呈现操作时分辨率可能未知,所以设置 Graphics2DTransform 将用户坐标转换为虚拟设备空间,该设备空间与目标设备的预期分辨率接近。如果估计值不正确,则在播放时可能需要进一步转换。

某些由呈现属性对象执行的操作发生在设备空间中,但所有 Graphics2D 方法都采用用户空间坐标。

每个 Graphics2D 对象都与一个定义了呈现位置的目标相关联。GraphicsConfiguration 对象定义呈现目标的特征,如像素格式和分辨率。在 Graphics2D 对象的整个生命周期中都使用相同的呈现目标。

创建 Graphics2D 对象时,GraphicsConfiguration 将为 Graphics2D 的目标(ComponentImage)指定默认转换,此默认转换将用户空间坐标系统映射到屏幕和打印机设备坐标,这样,原点映射到设备目标区域的左上角,并将 X 坐标轴向右方延伸,将 Y 坐标轴向下方延伸。对于接近 72 dpi 的设备(例如屏幕设备),默认转换的缩放比例设置为恒等。对于高分辨率设备(例如打印机),默认转换的缩放比例设置为每平方英寸大约 72 个用户空间坐标。对于图像缓冲区,默认转换为 Identity 转换。

呈现过程

呈现过程可以分为四个阶段,这四个阶段由 Graphics2D 呈现属性控制。呈现器可以优化这些步骤,方法是通过缓存结果以用于未来调用、通过将多个虚拟步骤合成一个操作,或者通过将多种属性识别为共用的简单情况(可通过修改操作的其他部分来消除各种属性间的差别)。

呈现过程中的步骤有:

  1. 确定呈现内容。
  2. 将呈现操作限制在当前的 ClipClip 由用户空间中的 Shape 指定,并由该程序使用 GraphicsGraphics2D 的各种 clip 操作方法进行控制。此用户剪贴区 由当前的 Transform 转换到设备空间中,并且与设备剪贴区 组合,后者是通过窗口可见性和设备范围定义的。用户剪贴区和设备剪贴区的组合定义了复合剪贴区,它确定了最终的剪贴区域。用户剪贴区不能由呈现系统修改,以反映得到的复合剪贴区。
  3. 确定呈现的颜色。
  4. 使用 Graphics2D 上下文中当前的 Composite 属性将颜色应用于目标绘图面。

三种类型的呈现操作,以及各自特殊呈现过程的细节如下:
  1. Shape 操作
    1. 如果该操作为 draw(Shape) 操作,则 Graphics2D 上下文中当前 Stroke 属性上的 createStrokedShape 方法将用于构造包含指定 Shape 轮廓的新 Shape 对象。
    2. 使用 Graphics2D 上下文中的当前 TransformShape 从用户空间转换到设备空间。
    3. Shape 的轮廓是通过使用 ShapegetPathIterator 方法提取的,该方法返回一个沿着 Shape 边界迭代得到的 PathIterator 对象。
    4. 如果 Graphics2D 对象无法处理 PathIterator 对象返回的曲线段,则可以调用 ShapegetPathIterator 替代方法,该方法可使 Shape 变得平滑。
    5. 对于 PaintContext,需要 Graphics2D 上下文中的当前 Paint,它指定了在设备空间中呈现的颜色。
  2. 文本操作
    1. 下面的步骤用于确定呈现指定 String 所需的字形集:
      1. 如果参数是一个 String,则要求 Graphics2D 上下文中的当前 FontString 中的 Unicode 字符转换为一个字形集,以表现 font 实现的基本布局和成形算法。
      2. 如果参数是一个 AttributedCharacterIterator,则要求迭代器使用其内含的字体属性将其自身转换为 TextLayoutTextLayout 实现了更为复杂的字形布局算法,用于为不同书写方向的多种字体自动执行 Unicode 双方向布局调整。
      3. 如果参数是一个 GlyphVector,则 GlyphVector 对象已经包含了特定于字体的合适字形代码和每个字形位置的显式坐标。
    2. 查询当前的 Font 以获取指定字形的轮廓。这些轮廓被视为用户空间中相对于步骤 1 中确定的每个字形位置的形状。
    3. 字符轮廓按上面 Shape 操作下指示的方式填充。
    4. PaintContext 查询当前的 Paint,Paint 指定了设备空间中呈现的颜色。
  3. Image 操作
    1. 感兴趣区域由源 Image 的边框定义。此边框在图像空间中指定,该空间即 Image 对象的本地坐标系统。
    2. 如果 AffineTransform 被传递到 drawImage(Image, AffineTransform, ImageObserver),则使用 AffineTransform 将边框从图像空间转换到用户空间。如果未提供 AffineTransform,则认为边框已存在于用户空间中。
    3. 使用当前的 TransformImage 的边框从用户空间转换到设备空间。注意,转换边框的结果不一定会得到设备空间中的矩形区域。
    4. Image 对象确定要呈现的颜色,并根据由当前 Transform 和可选图像转换所指定的源到目标坐标的映射关系进行采样。

默认呈现属性

Graphics2D 呈现属性的默认值是:
Paint
Component 的颜色。
Font
ComponentFont
Stroke
线宽为 1 的方形画笔,没有虚线、斜角线段接合和方形端点。
Transform
用于 ComponentGraphicsConfigurationGraphicsConfiguration#getDefaultTransform()getDefaultTransform
Composite
AlphaComposite.SRC_OVER 规则。
Clip
不呈现 Clip,输出被剪贴到 Component

呈现兼容性问题

JDK(tm) 1.1 呈现模型是基于像素化的模型,该模型的坐标无限细分,位于像素之间。使用一个像素宽的画笔执行绘制操作,在路径锚点向下和向右填充像素。JDK 1.1 呈现模型与大多数现有平台呈现类的功能相一致,需要将整数坐标分析为离散的画笔,使其完全落在指定数量的像素上。

Java 2D(tm)(Java(tm) 2 平台)API 支持防重叠呈现器。与像素 N+1 相对,一像素宽的画笔不需要完全落在像素 N 上。该画笔可以部分落在这两个像素上。不需要为宽画笔选择一个偏离方向,因为画笔遍历边缘发生的混合可让画笔的子像素位置对用户可见。另一方面,如果通过将 KEY_ANTIALIASING 提示键设置为 VALUE_ANTIALIAS_OFF 提示值而关闭了防重叠,则当画笔跨在像素边界上时,呈现器可能需要应用某个斜线来确定要修改哪个像素,例如在设备空间中,当画笔沿着整数坐标绘制时。虽然防重叠呈现器的功能使之不再需要呈现模型为画笔指定一个斜线,但对于在屏幕上绘制一像素宽的水平线和垂直线这种常见情形,还需要防重叠和非防重叠呈现器执行类似的操作。为了确保通过将 KEY_ANTIALIASING 提示键设置为 VALUE_ANTIALIAS_ON 而打开的防重叠不会导致这些线突然变为此宽度的二倍或一半不透明,需要让该模型为这些线指定一个路径,使它们完全覆盖特定的像素集,以帮助提高其卷曲度。

Java 2D API 维持了与 JDK 1.1 呈现行为的兼容性,因此遗留操作和现有呈现器行为在 Java 2D API 下未改变。定义了映射到常规 drawfill 方法的遗留方法,它明确指示 Graphics2D 根据 StrokeTransform 属性和呈现提示的设置来扩展 Graphics 的方法。此定义在默认属性设置下一致。例如,默认 Stroke 是一个宽度为 1 且没有虚线的 BasicStroke,屏幕绘制的默认 Transform 是 Identity 转换。

下面两个规则提供了可预见的呈现行为(无论是否使用了重叠还是防重叠)。

  • 将设备坐标定义为在设备像素之间,这避免了重叠呈现和防重叠呈现的结果不一致。如果将坐标定义为在像素的中心,则由矩形等形状覆盖的某些像素仅是半覆盖。通过重叠的呈现,半覆盖的像素或者在形状内部呈现,或者形状外部呈现。使用防重叠呈现,整个形状边缘上的像素都是半覆盖的。另一方面,由于坐标定义为在像素之间,所以无论是否使用防重叠进行呈现,像矩形这样的形状将不会有半覆盖像素。
  • 使用 BasicStroke 对象勾画的线和路径可以“标准化”,从而在不同的可绘制点上定位时和无论使用重叠还是防重叠呈现进行的绘制都能提供一致的轮廓呈现。此标准化过程由 KEY_STROKE_CONTROL 提示所控制。虽然未指定准确的标准化算法,但此标准化的目标是为了确保可以使用一致的可视外观呈现线条,而不论它们在像素网格上的位置如何,并促进以防重叠模式呈现更连续的水平和垂直线,从而与没有防重叠的线更为相似。典型的标准化步骤可以将防重叠线端点提升到像素中心,以减少混合量,或调整无防重叠线的子像素位置,以便浮点线宽度四舍五入为近似相等的偶数或奇数像素计数。此过程可以将端点向上移动半个像素(通常沿两个坐标轴的正无穷大方向移动),以得到一致的结果。

下面定义常规遗留方法,与以前默认属性设置下指定行为的执行完全相同:

  • 对于 fill 操作,包括 fillRectfillRoundRectfillOvalfillArcfillPolygonclearRect,现在可以使用所需的 Shape 调用 fill。例如,在填充矩形时可调用:
    fill(new Rectangle(x, y, w, h));
    

  • 类似地,对于绘制操作,包括 drawLinedrawRectdrawRoundRectdrawOvaldrawArcdrawPolylinedrawPolygon,现在可以使用所需的 Shape 调用 draw。例如,在绘制矩形时可调用:
    draw(new Rectangle(x, y, w, h));
    

  • draw3DRectfill3DRect 方法是根据 Graphics 类中的 drawLinefillRect 方法实现的,根据 Graphics2D 上下文中的当前 StrokePaint 对象可以预知其行为。此类重写了那些只使用当前 Color 的实现,重写当前 Paint 并使用 fillRect 来描述与以前存在方法完全相同的行为,而不论当前 Stroke 的设置如何。
Graphics 类仅定义了 setColor 方法来控制要绘制的颜色。由于 Java 2D API 扩展了 Color 对象来实现新的 Paint 接口,因此现有的 setColor 方法现在是将当前 Paint 属性设置为 Color 对象的一个便捷方法。setColor(c) 等同于 setPaint(c)

Graphics 类定义两种方法,用于控制如何将颜色应用到目标。

  1. setPaintMode 方法实现为一种设置默认 Composite 的便捷方法,它等同于 setComposite(new AlphaComposite.SrcOver)
  2. setXORMode(Color xorcolor) 方法实现为一种设置特殊的 Composite 对象的便捷方法,它忽略源颜色的 Alpha 分量,并将目标颜色设置为以下值:
    dstpixel = (PixelOf(srccolor) ^ PixelOf(xorcolor) ^ dstpixel);
    

另请参见:
RenderingHints

构造方法摘要
protected Graphics2D()
          构建一个新的 Graphics2D 对象。
 
方法摘要
abstract  voidaddRenderingHints(Map<?,?> hints)
          为呈现算法设置任意数量的首选项值。
abstract  voidclip(Shape s)
          将当前 Clip 与指定 Shape 的内部区域相交,并将 Clip 设置为所得的交集。
abstract  voiddraw(Shape s)
          使用当前 Graphics2D 上下文的设置勾画 Shape 的轮廓。
 voiddraw3DRect(int x, int y, int width, int height, boolean raised)
          绘制指定矩形的 3-D 突出显示边框。
abstract  voiddrawGlyphVector(GlyphVector g, float x, float y)
          使用 Graphics2D 上下文的呈现属性,呈现指定 GlyphVector 的文本。
abstract  voiddrawImage(BufferedImage img, BufferedImageOp op, int x, int y)
          呈现使用 BufferedImageOp 过滤的 BufferedImage 应用的呈现属性包括 ClipTransformComposite 属性。
abstract  booleandrawImage(Image img, AffineTransform xform, ImageObserver obs)
          呈现一个图像,在绘制前进行从图像空间到用户空间的转换。
abstract  voiddrawRenderableImage(RenderableImage img, AffineTransform xform)
          呈现 RenderableImage,在绘制前进行从图像空间到用户空间的转换。
abstract  voiddrawRenderedImage(RenderedImage img, AffineTransform xform)
          呈现 RenderedImage,在绘制前进行从图像空间到用户空间的转换。
abstract  voiddrawString(AttributedCharacterIterator iterator, float x, float y)
          使用 Graphics2D 上下文的当前 Paint,呈现指定迭代器的文本。
abstract  voiddrawString(AttributedCharacterIterator iterator, int x, int y)
          使用 Graphics2D 上下文的当前 Paint,呈现指定迭代器的文本。
abstract  voiddrawString(String s, float x, float y)
          使用 Graphics2D 上下文中当前文本属性状态呈现由指定 String 指定的文本。
abstract  voiddrawString(String str, int x, int y)
          使用 Graphics2D 上下文中的当前文本属性状态呈现指定的 String 的文本。
abstract  voidfill(Shape s)
          使用 Graphics2D 上下文的设置,填充 Shape 的内部区域。
 voidfill3DRect(int x, int y, int width, int height, boolean raised)
          绘制一个用当前颜色填充的 3-D 突出显示矩形。
abstract  ColorgetBackground()
          返回用于清除区域的背景色。
abstract  CompositegetComposite()
          返回 Graphics2D 上下文中的当前 Composite
abstract  GraphicsConfigurationgetDeviceConfiguration()
          返回与此 Graphics2D 关联的设备配置。
abstract  FontRenderContextgetFontRenderContext()
          获取此 Graphics2D 上下文中 Font 的呈现上下文。
abstract  PaintgetPaint()
          返回 Graphics2D 上下文中的当前 Paint
abstract  ObjectgetRenderingHint(RenderingHints.Key hintKey)
          返回呈现算法的单个首选项的值。
abstract  RenderingHintsgetRenderingHints()
          获得呈现算法的首选项。
abstract  StrokegetStroke()
          返回 Graphics2D 上下文中的当前 Stroke
abstract  AffineTransformgetTransform()
          返回 Graphics2D 上下文中当前 Transform 的副本。
abstract  booleanhit(Rectangle rect, Shape s, boolean onStroke)
          检查指定的 Shape 是否与设备空间中的指定 Rectangle 相交。
abstract  voidrotate(double theta)
          将当前的 Graphics2DTransform 与旋转转换连接。
abstract  voidrotate(double theta, double x, double y)
          将当前的 Graphics2DTransform 与平移后的旋转转换连接。
abstract  voidscale(double sx, double sy)
          将当前 Graphics2DTransform 与可缩放转换连接。
abstract  voidsetBackground(Color color)
          设置 Graphics2D 上下文的背景色。
abstract  voidsetComposite(Composite comp)
          为 Graphics2D 上下文设置 CompositeComposite 用于所有绘制方法中,如 drawImagedrawStringdrawfill 它指定新的像素如何在呈现过程中与图形设备上的现有像素组合。
abstract  voidsetPaint(Paint paint)
          为 Graphics2D 上下文设置 Paint 属性。
abstract  voidsetRenderingHint(RenderingHints.Key hintKey, Object hintValue)
          为呈现算法设置单个首选项的值。
abstract  voidsetRenderingHints(Map<?,?> hints)
          使用指定的 hints 替换用于所有呈现算法首选项的值。
abstract  voidsetStroke(Stroke s)
          为 Graphics2D 上下文设置 Stroke
abstract  voidsetTransform(AffineTransform Tx)
          重写 Graphics2D 上下文中的 Transform。
abstract  voidshear(double shx, double shy)
          将当前 Graphics2DTransform 与剪裁转换连接。
abstract  voidtransform(AffineTransform Tx)
          根据“最后指定首先应用”规则,使用此 Graphics2D 中的 Transform 组合 AffineTransform 对象。
abstract  voidtranslate(double tx, double ty)
          将当前的 Graphics2DTransform 与平移转换连接。
abstract  voidtranslate(int x, int y)
          将 Graphics2D 上下文的原点平移到当前坐标系统中的点 (xy)。
 
从类 java.awt.Graphics 继承的方法
clearRect, clipRect, copyArea, create, create, dispose, drawArc, drawBytes, drawChars, drawImage, drawImage, drawImage, drawImage, drawImage, drawImage, drawLine, drawOval, drawPolygon, drawPolygon, drawPolyline, drawRect, drawRoundRect, fillArc, fillOval, fillPolygon, fillPolygon, fillRect, fillRoundRect, finalize, getClip, getClipBounds, getClipBounds, getClipRect, getColor, getFont, getFontMetrics, getFontMetrics, hitClip, setClip, setClip, setColor, setFont, setPaintMode, setXORMode, toString
 
从类 java.lang.Object 继承的方法
clone, equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

构造方法详细信息

Graphics2D

protected Graphics2D()
构建一个新的 Graphics2D 对象。由于 Graphics2D 是一个抽象类,而且它必须由不同输出设备的子类来自定义,所以无法直接创建 Graphics2D 对象。相反,Graphics2D 对象必须从另一个 Graphics2D 对象获得、由某个 Component 创建,或者从图像(如 BufferedImage)对象获得。

另请参见:
Component.getGraphics(), Graphics.create()
方法详细信息

draw3DRect

public void draw3DRect(int x,
                       int y,
                       int width,
                       int height,
                       boolean raised)
绘制指定矩形的 3-D 突出显示边框。矩形的边是突出显示的,从而它们从左上角看上去呈斜面并加亮。

突出显示效果所用的颜色根据当前颜色确定。得到的矩形覆盖的区域为 width + 1 像素宽,height + 1 像素高。此方法只使用当前 Color,并忽略当前 Paint

覆盖:
Graphics 中的 draw3DRect
参数:
x - 要绘制矩形的 x 坐标。
y - 要绘制矩形的 y 坐标。
width - 要绘制矩形的宽度。
height - 要绘制矩形的高度。
raised - 一个用于确定矩形是凸出平面显示还是凹入平面显示的 boolean 值。
另请参见:
Graphics.fill3DRect(int, int, int, int, boolean)

fill3DRect

public void fill3DRect(int x,
                       int y,
                       int width,
                       int height,
                       boolean raised)
绘制一个用当前颜色填充的 3-D 突出显示矩形。矩形的边是突出显示的,从而它们从左上角看上去呈斜面并加亮。突出显示效果和填充所用的颜色根据当前 Color 确定。此方法只使用当前 Color,并忽略当前 Paint

覆盖:
Graphics 中的 fill3DRect
参数:
x - 要填充矩形的 x 坐标。
y - 要填充矩形的 y 坐标。
width - 要填充矩形的宽度。
height - 要填充矩形的高度。
raised - 一个用于确定矩形是凸出平面显示还是凹入平面显示的 boolean 值。
另请参见:
Graphics.draw3DRect(int, int, int, int, boolean)

draw

public abstract void draw(Shape s)
使用当前 Graphics2D 上下文的设置勾画 Shape 的轮廓。应用的呈现属性包括 ClipTransformPaintCompositeStroke 属性。

参数:
s - 要呈现的 Shape
另请参见:
setStroke(java.awt.Stroke), setPaint(java.awt.Paint), Graphics.setColor(java.awt.Color), transform(java.awt.geom.AffineTransform), setTransform(java.awt.geom.AffineTransform), clip(java.awt.Shape), Graphics.setClip(int, int, int, int), setComposite(java.awt.Composite)

drawImage

public abstract boolean drawImage(Image img,
                                  AffineTransform xform,
                                  ImageObserver obs)
呈现一个图像,在绘制前进行从图像空间到用户空间的转换。从用户空间到设备空间的转换使用 Graphics2D 中当前的 Transform 完成。在应用 Graphics2D 上下文中的 transform 属性之前,指定的转换被应用到图像。应用的呈现属性包括 ClipTransformComposite 属性。注意,如果指定的转换不可逆,则不会完成呈现。

参数:
img - 要呈现的指定图像。如果 img 为 null,则此方法不执行任何动作。
xform - 从图像空间到用户空间的转换
obs - 转换了多个 Image 时要通知的 ImageObserver
返回:
如果 Image 被完全装入并完全呈现,则为 true,否则为 null;如果仍在加载 Image,则为 false
另请参见:
transform(java.awt.geom.AffineTransform), setTransform(java.awt.geom.AffineTransform), setComposite(java.awt.Composite), clip(java.awt.Shape), Graphics.setClip(int, int, int, int)

drawImage

public abstract void drawImage(BufferedImage img,
                               BufferedImageOp op,
                               int x,
                               int y)
呈现使用 BufferedImageOp 过滤的 BufferedImage 应用的呈现属性包括 ClipTransformComposite 属性。这等价于:
 img1 = op.filter(img, null);
 drawImage(img1, new AffineTransform(1f,0f,0f,1f,x,y), null);

参数:
op - 在呈现之前要应用到图像的过滤器
img - 要呈现的指定 BufferedImage 如果 img 为 null,则此方法不执行任何动作。
x - 该位置的 x 坐标,它位于呈现该图像左上角的用户空间中
y - 该位置的 y 坐标,它位于呈现该图像左上角的用户空间中
另请参见:
transform(java.awt.geom.AffineTransform), setTransform(java.awt.geom.AffineTransform), setComposite(java.awt.Composite), clip(java.awt.Shape), Graphics.setClip(int, int, int, int)

drawRenderedImage

public abstract void drawRenderedImage(RenderedImage img,
                                       AffineTransform xform)
呈现 RenderedImage,在绘制前进行从图像空间到用户空间的转换。从用户空间到设备空间的转换使用 Graphics2D 中当前的 Transform 完成。在应用 Graphics2D 上下文中的 transform 属性之前,指定的转换被应用到图像。应用的呈现属性包括 ClipTransformComposite 属性。注意,如果指定的转换不可逆,则不会完成呈现。

参数:
img - 要呈现的图像。如果 img 为 null,则此方法不执行任何动作。
xform - 从图像空间到用户空间的转换
另请参见:
transform(java.awt.geom.AffineTransform), setTransform(java.awt.geom.AffineTransform), setComposite(java.awt.Composite), clip(java.awt.Shape), Graphics.setClip(int, int, int, int)

drawRenderableImage

public abstract void drawRenderableImage(RenderableImage img,
                                         AffineTransform xform)
呈现 RenderableImage,在绘制前进行从图像空间到用户空间的转换。从用户空间到设备空间的转换使用 Graphics2D 中当前的 Transform 完成。在应用 Graphics2D 上下文中的 transform 属性之前,指定的转换被应用到图像。应用的呈现属性包括 ClipTransformComposite 属性。注意,如果指定的转换不可逆,则不会完成呈现。

可以在呈现 RenderableImage 时,使用在 Graphics2D 对象上设置的呈现提示。如果由指定 RenderableImage 识别的特定提示需要显式控制,如果需要知道使用哪一个提示,则应直接从 RenderableImage 获取 RenderedImage,并使用 drawRenderedImage 呈现它。

参数:
img - 要呈现的图像。如果 img 为 null,则此方法不执行任何动作。
xform - 从图像空间到用户空间的转换
另请参见:
transform(java.awt.geom.AffineTransform), setTransform(java.awt.geom.AffineTransform), setComposite(java.awt.Composite), clip(java.awt.Shape), Graphics.setClip(int, int, int, int), drawRenderedImage(java.awt.image.RenderedImage, java.awt.geom.AffineTransform)