技术开发 频道

保留的图形对象API 简介

  【IT168 技术文章】Java 专家 Barry Feigenbaum 创建了保留的图形对象(Retained Graphic Objects (RGO))API 来启用 Java 平台的可重用图形对象的创建。本文中,Barry 描述了组成 RGO API 的类和方法,并在 Java 编程环境中演示了它们的使用。遵照本文中的上机实践示例,您将学会如何创建并保留诸如直线、椭圆、矩形、文本、子图形等对象类型。

  创建持久(或者保留的)图形的能力还不是“抽象窗口工具箱(Abstract Window Toolkit (AWT))”的标准部分。相反,绘制的每个图形在每次显示其包含的容器时由应用程序代码重新绘制。本文中,我将向您介绍,如何通过向 Java 平台添加保留的图形对象(RGO)来解决 AWT 这个局限性。我的开发的方法 ― RGO API ― 需要的代码最少,并且可以在需要的时候允许您添加并实现多种对象类型。

  保留的图形对象

  RGO 提供了基于创建可绘制对象(类 Drawable 的实例)的强大和便利的绘图性能,这些对象收集在一个有序集(类 DrawableSequencer 的实例)中,然后每当需要呈现一个给定的对象时,它就重新绘制这个集合。可绘制对象和对象集都有描绘服务并且可以持久地储存它们自己。第三个相关类称为 DrawingContext ,它抽取类 java.awt.Graphics 中定义的 Java 对象表示服务。(请注意,出于本文的目的,我们将使用 Graphics 类,而不是更强大更复杂的 Graphics2D 。将 Graphics2D 用于更丰富的图形是一个简单的扩展问题。)

  通过为每个保留的对象形式创建类的类型来定义 RGO。这些类都是类 Drawable 的子类,它们定义了可以保留的图形对象的类型。直线、椭圆、矩形、文本和子图形是其中一些类型示例。我们在本文中定义的相应样本对象是:

  DrawableLine

  DrawableOval

  DrawableBox

  DrawableText

  DrawableSprite

  许多其它图形对象类型,比如位图、三角形和常规的多边形可以根据需要添加。

  使用 drawables

  图 1 是一个说明 drawables 包中各类之间关系的 UML 模型。请注意 Drawables 、 DrawableSequencer 和 DrawingContext 之间的关系。

  图 1. drawables 包中各类的关系

  在下面的图 2 中,我向 DrawableSequencer 实例添加了 Drawable 子类的三个实例。一组 DrawableSequencerObject 实例记录了可绘制对象的显示优先级和对它的一个引用(实线箭头所示)。 DrawableSequencerObject 实例记录在 DrawableSequencer 实例内部的集合(实际上是 java.util.Vector )中。

  在任何 DrawableSequencer.draw(DrawingContext) 方法调用期间,使用 DrawableSequencerEnumerator 实例来枚举(通过虚线箭头) DrawableSequencerObject 对象。

  图 2. 向 DrawableSequencer 添加 Drawable 的三个实例

  DrawingContext 实例实际上将在应用程序客户机窗口中描绘对象。客户机窗口是由 java.awt 和 javax.swing 类库中的类以及应用程序维护的。枚举器调用 Drawable.draw(DrawingContext) 方法。那个方法转而调用 Drawable.drawWorker(DrawingContext) 方法,通过调用 DrawingContext.draw...() 方法来处理请求,其中的省略号(...)表示图形类型。然后, DrawingContext 实例将绘图请求转发到与 DrawingContext 关联的 java.awt.Graphics 实例。

  图 2 中显示的描绘对象步骤如下所示:

  使用在其它地方创建的 java.awt.Graphics 对象创建 DrawingContext 实例。(这通常在应用程序的 paint(Graphics) 方法中完成,其中 Graphics 对象作为来自 Java 运行时支持的参数传入。)

  调用传递 DrawingContext 实例的 DrawableSequencer.draw() 方法。

  DrawableSequencer.draw() 创建 DrawableSequencerEnumerator 实例来遍历 DrawableSequencer 的集合中的所有对象。

  下一步,对于集合中的每个 DrawableSequencerObject :

  为 Drawable 实例调用 Drawable.draw() 方法,该实例与向它传递 DrawingContext 实例的 DrawableSequencerObject 实例相关联。

  如果这个实例可见,那么 Drawable.draw() 立即为那个实例调用 Drawable.drawWorker() 。

  Drawable.drawWorker() 通过调用形成对象的对象所需的 DrawingContext.draw... 例程来处理描绘请求。例如, DrawableBox 对象将使用 DrawingContext.drawBox() 方法。 Drawable.drawWorker() 方法可能在调用 DrawingContext.draw...() 方法之前执行对象转换。

  然后 DrawingContext.draw...() 通过调用一个或多个 java.awt.Graphics() 方法来处理描绘请求。

  为绘制一个实心(相对于空心)矩形, DrawingContext.drawBox() 方法将使用 Graphics.setColor() 方法和 Graphics.fillRect() 方法。然后, DrawingContext.draw...() 方法可能在调用 Graphics 方法完成操作之前执行对象转换。

0
相关文章