定制小窗口

有时,您可能会发现 SWT 中提供的控件没有任何一个能满足应用程序的需要。在这些情况下,您可能想通过实现您自己的定制小窗口来扩展 SWT。SWT 本身提供了一个包 org.eclipse.swt.custom, 它包含不在 SWT 控件的核心组中,但作为实现平台工作台所需要的定制控件。

控件
用途
样式
事件

CCombo

类似于组合框,但是定制绘制以便允许使用没有边界的组合框。开发此类的目的是为了在表单元内使用组合框。

BORDER、FLAT 和 READ_ONLY

销毁、控件* 和选择

CLabel

类似于标签,但是支持剪辑带有省略的文本。当在活动工作台视图中查看时,还支持背景颜色的倾斜效果。不支持覆盖。

CENTER、LEFT、RIGHT、SHADOW_IN、SHADOW_OUT 和 SHADOW_NONE

销毁和控件*

CTabFolder

类似于 TabFolder,但是它支持标记(顶部或底部)和边界的可视外观的附加配置。

BORDER、FLAT、BOTTOM 和 TOP

销毁、控件* 和选择

CTabItem

与 CTabFolder 中的页面的选项卡相对应的可选择用户界面对象。

 
销毁和控件*

SashForm

组合体控件,将它的子代布局为按行或列排列, 并使用“窗框”来分隔它们,以便用户可以调整它们的大小。

BORDER、HORIZONTAL 和 VERTICAL

销毁和控件*

ScrolledComposite

组合体控件,滚动它的内容,并可选择伸展其内容以填充可用空间。

BORDER、H_SCROLL 和 V_SCROLL

销毁和控件*

StyledText

可编辑的控件,允许用户输入文本。控件内的文本范围可以具有截然不同的字体和颜色(前台和后台)。

BORDER、FULL_SELECTION、MULTI、SINGLE、WRAP 和 READ_ONLY

销毁、控件*、ExtendedModify、LineGetBackground、LineGetSegments、LineGetStyle、修改、选择、验证和 VerifyKey

TableTree

可选择的控件,它显示用户可以选择的项的分层列表。项是按行提供的,它显示表示项的不同方面的多列。

BORDER、SINGLE、MULTI、CHECK 和 FULL_SELECTION

销毁、控件*、选择、缺省选择、折叠和展开

TableTreeItem

可选择的用户界面对象,表示 TableTree 中的树项的层次结构。

 
 

ViewForm

组合体控件,它在水平方向布局三个子代,并允许有计划地控制布局和边界参数。用于在工作台中来实现视图的标号/工具栏/菜单局部栏。

BORDER 和 FLAT

销毁和控件*

控件* = 从控件中继承的事件:焦点进入、焦点离开、帮助、键按下、键抬起、鼠标双击、鼠标按下、鼠标进入、鼠标离开、鼠标悬浮、鼠标抬起、鼠标移动、移动、绘制和调整大小

在实现定制小窗口之前,应当考虑几个重要问题:

一旦已经确定了您需要定制小窗口并且已经决定了必须支持哪些平台, 就可以考虑小窗口的几种实现技术。根据底层 OS 平台中提供的内容,这些技术可以配合使用。

本机实现

如果应用程序需要不是由 SWT 提供的本机小窗口,则将需要在本地实现它。这可以是平台小窗口、第三方小窗口或者是平台共享库中的其它任何小窗口。

每个 SWT 平台都交付有共享库(例如,Windows 上的 DLL)和 JAR(表示 Java 类文件)。共享库包含 SWT 需要的所有本机功能,但是,它并不意味着平台上可用的一组完整功能。要展示 SWT 未展示的本机功能或本机小窗口,需要编写您自己的共享库。如果您正在使用一个平台上的本机代码与另一个平台上的可移植代码的组合, 则应确保在具有本机小窗口的平台上调用共享库,并在具有可移植小窗口的平台上调用 JAR。

要实现本机小窗口,则必须了解“Java 本机接口”(JNI)、 共享库中的小窗口的 API 以及用 C 语言编写的底层 OS 平台 API。

实现的基本过程会决定在 Java API 中将展示本机小窗口的 API 的哪一部分, 并编写 Java 代码来调用本机程序以实现该行为。必须编写 JNI C 语言代码才能调用共享库。

在构建您自己的本机小窗口实现时,最好是遵循用来实现 SWT 的设计原则。例如,JNI 本机程序应该与在共享库中执行的 API 调用进行一一映射。

可以在使用 SWT 来创建您自己的小窗口... 中找到本机定制小窗口实现的完整示例。

扩展现有小窗口

如果新的小窗口在概念或实现上类似于现有小窗口,则您可能想覆盖现有 SWT 小窗口。此技术用于实现TableTree

要覆盖小窗口,应创建组合体或者画布小窗口的子类(这取决于您的控件是否将具有子代)。在定制小窗口的构造器中,创建覆盖的小窗口。生成的小窗口将是 100% Java 可移植的,原因是您正在调用覆盖的小窗口的 API 来进行实现。

通过覆盖小窗口来实现定制小窗口通常要比从头实现定制小窗口更简单。然而,在设计新的小窗口的 API 时一定要仔细。以下是一些重要提示:

考虑您的小窗口是否是一种被覆盖的小窗口,或者它只是使用一个被覆盖的小窗口来进行实现。例如,表树不是一种表。它并不按行号索引引用项。TableTree 只使用表来实现表示和添加树行为。如果您纯粹是为了实现原因而覆盖小窗口,则您的 API 可能看起来不会类似于底层小窗口的 API。

尽可能少地转发方法和事件。不要重复实现覆盖的小窗口的整个 API, 否则,当覆盖的 API 在将来发行版中发生更改时,您将需要经常进行采用。应当转发大多数小窗口的公共方法,例如,setFontsetForegroundsetBackground

如果您发现您自己正在实现大多数覆盖的小窗口的 API, 则应考虑在 API 级别展示覆盖的小窗口,并允许应用程序代码直接使用覆盖的小窗口。在此情况下,您可能想重新考虑提供新的小窗口是否有意义。作为“适配器”来实现您的功能部件可能会更好, 它将行为添加到小窗口中,而不是将自己当作小窗口。(JFace 查看器就遵循此模式。)

注意:此讨论已将焦点全放在通过覆盖小窗口来扩展小窗口的行为。强烈建议不要通过子类化小窗口来扩展小窗口,原因是它将使您的小窗口依赖于超类的实现。

定制的已绘制的实现

在某些情况下,没有任何本机代码或现有小窗口来帮助您实现新的小窗口。这就意味着您自己必须使用 SWT 图形调用来绘制小窗口。尽管此技术可能会变得相当复杂,但是它具有可以生成完全可移植的实现的优点。

定制的已绘制的控件是通过使用下列规则来子类化画布组合体类来实现的。

在定制的已绘制的控件中,内部状态保存在 Java 实例变量中。根据小窗口的要求来定义您的 API 和样式。

定制的已绘制的小窗口的内部实现通常涉及到下列主要任务:

org.eclipse.swt.custom 中实现的许多小窗口都使用此方法。可以在 CLabel 中找到简单的示例。

有关定制小窗口进一步的信息可以在使用 SWT 来创建您自己的小窗口中找到。

Copyright IBM Corporation and others 2000, 2003.