4,接口继承层次设计
IFigure定义了一个图形元素必须要实现的基本功能,通过对IFigure进行扩展可以为图形元素提供额外的功能。
FreeFormFigrue允许它的孩子向负坐标空间扩展。这个图形元素一定要被放置在FreeformViewport 中。另外,你不能对这个图形元素调用IFigure.setBounds(Rectangle)。它的边界将基于它的孩子的范围被计算。一个FreeFormFigrue图形元素的边界将是含有它的所有孩子的最小矩形。
· Orientable表示可以水平或垂向放置的图形元素。
· Connection表示两个图形元素之间的连接。
· RotatableDecoration表示可以旋转的图形元素。
· ScalableFigure表示可以被比例化的图形元素。
5,图层设计 图层是图形元素的容器,通过使用图层可以方便对图形元素的管理。
· Layer是一透明的只能被增加到LayeredPane 的图形元素,LayeredPane 要负责管理它的layers。
· FreeFormLayer是一个能够向所有的4个方向扩展的Layer。
· ConnectionLayer是一个专门设计用来处理连接的Layer。这么做的原因是考虑到要为连接增加一个路由器的必要性。
· LayeredPane是一个能够持有任何数目的layer的图形元素。只有Layer能够被增加到这个图形元素。· Layer在被增加到这个图形元素时一定要赋予一个key,这个key唯一的标识了这个Layer。
· ScalableLayeredPane代表一个非自由的可比例化的LayeredPane。
· FreeformLayeredPane是一个含有FreeformLayer的LayeredPane 。
· ScalableFreeformLayeredPane是一个含有FreeformLayer的可比例化的LayeredPane 。 图层图形元素的设计类图
6,其它的图形元素的实现
LightweightSystem.RootFigure是LightweightSystem中的根图形元素。 LightweightSystem.RootFigure是LightweightSystem中的根图形元素。
· ScrollBar为ScrollPane 提供滚动条。一个ScrollBar由5个必须的图形元素组成:一个“up”箭头按钮、一个“down”箭头按钮、一个可拖动的“thumb”,一个“Pageup”按钮、一个“Pagedown”按钮。因为滚动条既可水平放置又可垂直放置,所以它实现了Orientable接口。
· ImageFigure简单的含有一个图象的图形元素。当显示没有任何文本与其伴随的图象时要使用这个图形元素而不是label。注意,处置这个图象是客户的职责。
· Label表示一个能够显示文本或图象(可以同时显示)的图形元素。因为需要对label的文本或图象的位置进行布局,所以Label实现了PositionConstants接口。
· Thumbnail代表一个能够以较小的尺寸显示它的源图形元素的图象的图形元素。这个Thumbnail将维护源图形元素的面貌比率(也就是高和宽的缩放比例相同)。
· ScrollableThumbnail表示一个图形元素的可比例化的图象表示。如果源图形元素完全是不可见的,那么一个SelectorFigure 被放置在thumbnail上 以代表可浏览区域的并且能够被四处拖动来滚动源图形元素。
· Panel是一个通用的容器。这个图形元素默认是不透明的并且将要么用被设置在该图形元素上的背景色要么用IGraphics中当前的背景色填充它的整个约束范围。不透明的图形元素有助于优化绘制。注意到,在panel超类中的paintFigure()方法实际上已经填充了这个图形元素的约束范围。
· LabeledContainer 是一个带有描述容器内容的标题条的容器。这个框架是被一个LabeledBorder生成的。
7,视口设计
有时在画布上的图形元素过多,在控件窗口中显示不下,那么就需要利用视口技术显示需要被显示的图形元素。
· ScrollPane是一个实现了自动水平或(和)垂直滚动的类。ScrollPane中的滚动条的可见性是用整数代表的:NEVER:从来不显示滚动条;AUTOMATIC:当ScrollPane不再能够容纳它的视图时按需显示滚动条;ALWAYS:总是显示滚动条。为了使用它,先实例化一个ScrollPane对象,然后调用它的SetView(IFigure)方法传递给它想要有滚动能力的图形元素。ViewPort是一个位于ScrollPane 之上的灵活窗口,代表ScrollPane 的可见部分。
· FreeformViewport是一个专门用于FreeformFigures的视口。FreeformFigures只能驻留在这种类型的视口中。
· ViewPort实现了PropertyChangeListener,所以它是一个属性监听器。当ScrollPane的属性发生变化时(当然要先把它注册到ScrollPane中),它就会得到通知,然后重新计算ScrollPane可见区域并更新显示。
当显示图形元素的过程中,可以为图形元素增加一些修饰,其中的一个修饰是边界,例如在一个图形元素的周围显示其约束矩形等。 · Border接口表示一个恰好被绘制在图形元素外边缘上的图形修饰物。
· LabeledBorder表示一个在它的某个地方有文本消息的边界修饰物。可以设置文本的字体。当label发生变化时,LabeledBorder不应该改变它的Insets,因而使用这个边界的Figures应该在更新label时重绘这个边界,在改变文本的字体时,要使边界重新有效。
· AbstractBorder提供了边界的通用实现。
· AbstractLabeledBorder为带有描述它所包围的内容的标签的边界提供支持。它实现了LabeledBorder接口。
· GroupBoxBorder是一个带标签的打算用于容纳带一组孩子的图形元素。这个标签充当这个组的描述。它是AbstractLabeledBorder的子类。
· TitleBarBorder提供一个关于它所包围的图形元素的标题条。通常被同其它的边界一起用来创建一个类窗口的效果。它也提供在标题条上的文本对齐能力。它是AbstractLabeledBorder的子类。
· CompoundBorder允许两个边界的嵌套。被嵌套的边界被称之为内外边界。
· FrameBorder提供一个类框架的含有一个标题条以容纳图形元素标题的边界。它是CompoundBorder的子类并实现了LabeledBorder接口。
· FocusBorder看起来象系统的聚焦矩形。
· LineBorder提供一个各边宽度相等的线边界。
· MarginBorder提供空白padding的边界。
· SchemeBorder允许创建基于方案的边界。一个方案是一个其唯一作用是携带边界相关信息的类。SchemeBorder 基于被设置到它的方案所给定的信息呈现边界。
· ButtonBorder为可点击类型图形元素创建一个边界,它要同这个图形元素和它的模型一道完成这个过程。这个边界调整它自己到各种不同的状态以与图形元素的模型的状态保持一致。这个边界使用一个被称之为ButtonBorder.ButtonScheme 的的扩展方案:
SimpleEtchedBorder提供两个象素宽的边界,有一种被蚀刻的视觉效果。这个类从SchemeBorder派生而来。
SimpleLoweredBorder提供一个凹进去的边界。这个类从SchemeBorder派生而来。
SimpleRaisedBorder提供一个突出来的边界,这个类从SchemeBorder派生而来。
SchemeBorder.Scheme对象携带绘制方案边界所需要的信息。它持有关于边界的信息集,这些信息能够被改变以创建广范围的方案。它为边界透明度、大小、高亮边和阴影边的颜色提供支持。ButtonBorder.ButtonScheme从SchemeBorder.Scheme派生;它提供一个方案来表示象button之类的可点击物的边界。尽管跟Scheme 相似,但它为被按下的状态提供额外的边界集合。
这章就先写到这儿,太多了。下次该剖析draw2d内部运行的过程了,主要包括:更新管理器是如何设计的?事件派发器是如何设计的?如何定义抽象的图形对象并实现具体的图形对象?IFigure是如何被绘制的以及与IFigure相关的一些有一定难度的问题。
这章本来打算提供一个dxf浏览器和其相关源代码的,但是因为还没有整理好,只有等下次再提供了。打算提供的内容如下:
1. 一个我用.Net改写的draw2d库,但抱歉的是,暂不能提供源代码。
2. 一个解析DXF文件层dxf模型的解析库以及描述dxf文件格式的CHM文件。该解析库是我写的,提供所有的源代码。
3. 提供一个基于draw2d库的dxf文件浏览器以及源代码。
本文地址:http://com.8s8s.com/it/it10058.htm