在 Java 2 平台之前,语言中的图形功能相当简单,仅限于单像素厚度的实线;少数几个几何图形(如椭圆、弧和多边形);和基本的画图功能。随着 Java 2D API(它包含一个真正的功能集)的出现,所有的一切都改变了。
这个 API 的核心是由 java.awt.Graphics2D 类提供的,该类是 java.awt.Graphics 的一个子类。API 的其它部分由 java.awt 层次结构中的其它包提供,包括 java.awt.color 、 java.awt.font 和 java.awt.geom 。
java.awt.Graphics2D 类
这个类是 java.awt.Graphics (该类在 Java 2 发行前就提供图形功能)的一个子类。这样安排的原因是:向后兼容。组件的着色还是通过调用它们的 paint() 方法,它使用一个 Graphics 对象。
尽管在语言的当前版本中,这个对象真是一个 Graphics2D 对象。这意味着, paint() 方法可以将 Graphics 对象作为一个 Graphics 对象使用(使用旧的画图方法),或者将其强制转换成 Graphics2D 对象。如果使用第二种选择,就可以使用 2D API 的所有附加功能。
java.awt.geom 包
java.awt.geom 包提供一些有关二维几何的类,如 Arc2D 、 Line2D 、 Rectangle2D 、 Ellipse2D 和 CubicCurve2D 。其中每一个都是抽象类,他们都是两个名为 Double 和 Float 的非抽象内部类(它们是抽象外部类的子类)。
这些类允许各种几何图形建立在双精度或浮点精度的坐标系上。例如, newEllipse2D.Float(x,y,w,h) 将在 (x,y) 点上构造一个以宽为 w、高为 h 的矩形为边界的椭圆,其中 x、y、w和 h都为浮点值。
在这个包里还有 AffineTransform 类,它是组成 2D API 的核心元素。仿射转换指的是平行线在转换后还保持平行。这种类型的转换示例包括如下的操作:平移、旋转、缩放、剪切或者这些操作的组合。每一个转换都可以用一个 3x3 的矩阵来表示,该矩阵规定转换的源点和目标点之间的映射。
AffineTransform 类的实例可以直接从一个浮点值的矩阵中创建,尽管通常情况下是通过规定一个或多个平移、旋转、缩放或剪切操作来创建。多数情况下是使用双精度值,并且角度是用弧度来度量的(而不是 Arc2D 类中使用的度)。
文本着色
Java 2D API 的文本功能也相当强大。它们包括:
使用抗锯齿处理和微调(hinting)以达到更好的输出质量
可以使用系统安装的所有字体
可以将对图形对象的操作(旋转、缩放、着色、剪切等等)应用到文本上。
支持向字符串添加内嵌属性(如字体、尺寸、深浅,甚至图像)
支持双向文本(启用从右到左的字符顺序,就象您在阿拉伯语和希伯来语中可能遇到的一样)
第一光标和第二光标能够浏览同时包含从右到左和从左到右字符顺序的文本。
先进的字体度量功能,超过旧的 java.awt.FontMetrics 类中的相应功能
排版功能可以实现单词换行和调整多行文本
清单 1 包含一个使用部分 Java 2D 方法的基本示例的代码,加上几个其它的方法。这是一个完整的程序,但只是接触了 2D API 所提供的功能的皮毛。(输出请参见图 4)。
清单 1. 一个简单的 Java 2D 示例
2 import java.awt.geom.*;
3 public class j2d extends Frame {
4 public static void main(String args[]) { new j2d(); }
5 public j2d() {
6 setSize(220,180);
7 setVisible(true);
8 }
9 public void paint(Graphics g) {
10 // Obtain a Graphics2D object
11 Graphics2D g2 = (Graphics2D)g;
12 // Set the rendering quality.
13 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
14 RenderingHints.VALUE_ANTIALIAS_ON);
15 // define a linear colour gradient
16 GradientPaint gp = new GradientPaint(0, 60, Color.red,
17 0, 120, Color.yellow);
18 Ellipse2D r = new Ellipse2D.Float(30, 60, 160, 60);
19 g2.setPaint(gp);
20 g2.fill(r);
21 // set rotation
22 g2.transform(AffineTransform.getRotateInstance(Math.PI/8));
23 g2.setFont(new Font("Serif", Font.BOLD, 85));
24 g2.setPaint(Color.blue);
25 // set compositing rule with transparency
26 g2.setComposite(AlphaComposite.getInstance(
27 AlphaComposite.SRC_OVER, 0.5f));
28 g2.drawString("J2D",50,70);
29 }
30 }
31
图 4. 清单 1 的输出
