有时,您可能会发现 SWT 中提供的控件没有任何一个能满足应用程序的需要。在这些情况下,您可能想通过实现您自己的定制窗口小部件来扩展 SWT。SWT 本身提供了一个包 org.eclipse.swt.custom,它包含不在 SWT 控件的核心组中,但作为实现平台工作台所需要的定制控件。
控件
|
用途
|
样式
|
事件 |
---|---|---|---|
类似于组合框,但是定制绘制以便允许使用没有边界的组合框。开发此类的目的是为了在表单元内使用组合框。 |
BORDER、FLAT 和 READ_ONLY |
除去、控件* 和选择 | |
类似于标注,但是支持剪辑带有省略的文本。当在活动工作台视图中查看时,还支持背景色的倾斜效果。不支持覆盖。 |
CENTER、LEFT、RIGHT、SHADOW_IN、SHADOW_OUT 和 SHADOW_NONE |
除去和控件* | |
类似于 TabFolder,但是它支持标记(顶部或底部)和边界的可视外观的附加配置。 |
BORDER、FLAT、BOTTOM 和 TOP |
除去、控件* 和选择 | |
与 CTabFolder 中的页面的选项卡相对应的可选择用户界面对象。 |
|
除去和控件* | |
组合体控件,将它的子代布局为按行或列排列,并使用“窗框”来分隔它们,以便用户可以调整它们的大小。 |
BORDER、HORIZONTAL 和 VERTICAL |
除去和控件* | |
组合体控件,滚动它的内容,并可选择伸展其内容以填充可用空间。 |
BORDER、H_SCROLL 和 V_SCROLL |
除去和控件* | |
可编辑的控件,允许用户输入文本。控件内的文本范围可以具有截然不同的颜色(前台和后台)和字体样式(粗体和常规)。 |
BORDER、FULL_SELECTION、MULTI、SINGLE、WRAP 和 READ_ONLY |
除去、控件*、ExtendedModify、LineGetBackground、LineGetSegments、LineGetStyle、修改、选择、验证和 VerifyKey | |
可选择的控件,它显示用户可以选择的项的分层列表。项是按行提供的,它显示表示项的不同方面的多列。 |
BORDER、SINGLE、MULTI、CHECK 和 FULL_SELECTION |
除去、控件*、选择、缺省选择、折叠和展开 | |
可选择的用户界面对象,表示 TableTree 中的树项的层次结构。 |
|
||
组合体控件,它在水平方向布局三个子代,并允许有计划地控制布局和边界参数。用于在工作台中来实现视图的标注/工具栏/菜单局部栏。 |
BORDER 和 FLAT |
除去和控件* |
控件* = 从控件中继承的事件:进入焦点、离开焦点、帮助、按下键、松开键、双击鼠标、按下鼠标、进入鼠标、离开鼠标、悬浮鼠标、松开鼠标、移动鼠标、移动、绘制和调整大小
在实现定制窗口小部件之前,应当考虑几个重要问题:
一旦已经确定了您需要定制窗口小部件并且已经决定了必须支持哪些平台,就可以考虑窗口小部件的几种实现技术。根据底层操作系统平台中提供的内容,这些技术可以配合使用。
如果应用程序需要不是由 SWT 提供的本机窗口小部件,则将需要在本地实现它。这可以是平台窗口小部件、第三方窗口小部件或者是平台共享库中的其它任何窗口小部件。
每个 SWT 平台都交付有共享库(例如,Windows 上的 DLL)和 JAR(表示 Java 类文件)。共享库包含 SWT 需要的所有本机功能,但是,它并不意味着平台上可用的一组完整功能。要展示 SWT 未展示的本机功能或本机窗口小部件,需要编写您自己的共享库。如果您正在使用一个平台上的本机代码与另一个平台上的可移植代码的组合,则应确保在具有本机窗口小部件的平台上调用共享库,并在具有可移植窗口小部件的平台上调用 JAR。
要实现本机窗口小部件,则必须了解“Java 本机接口”(JNI)、共享库中的窗口小部件的 API 以及用 C 语言编写的底层操作系统平台 API。
实现的基本过程会决定在 Java API 中将展示本机窗口小部件的 API 的哪一部分,并编写 Java 代码来调用本机程序以实现该行为。必须编写 JNI C 语言代码才能调用共享库。
在构建您自己的本机窗口小部件实现时,最好是遵循用来实现 SWT 的设计原则。例如,JNI 本机程序应该与在共享库中执行的 API 调用进行一一映射。
可以在使用 SWT 来创建您自己的窗口小部件... 中找到本机定制窗口小部件实现的完整示例。
如果新的窗口小部件在概念或实现上类似于现有窗口小部件,则您可能想覆盖现有 SWT 窗口小部件。此技术用于实现TableTree。
要覆盖窗口小部件,应创建组合体或者画布窗口小部件的子类(这取决于您的控件是否将具有子代)。在定制窗口小部件的构造函数中,创建覆盖的窗口小部件。生成的窗口小部件将是 100% Java 可移植的,原因是您正在调用覆盖的窗口小部件的 API 来进行实现。
通过覆盖窗口小部件来实现定制窗口小部件通常要比从头实现定制窗口小部件更简单。然而,在设计新的窗口小部件的 API 时一定要仔细。以下是一些重要提示:
考虑您的窗口小部件是否是一种被覆盖的窗口小部件,或者它只是使用一个被覆盖的窗口小部件来进行实现。例如,表树不是一种表。它并不按行号索引引用项。TableTree 只使用表来实现表示和添加树行为。如果您纯粹是为了实现原因而覆盖窗口小部件,则您的 API 可能看起来不会类似于底层窗口小部件的 API。
尽可能少地转发方法和事件。不要重复实现覆盖的窗口小部件的整个 API,否则,当覆盖的 API 在将来发行版中发生更改时,您将需要经常进行采用。应当转发大多数窗口小部件的公共方法,例如,setFont、setForeground 和 setBackground。
如果您发现您自己正在实现大多数覆盖的窗口小部件的 API,则应考虑在 API 级别展示覆盖的窗口小部件,并允许应用程序代码直接使用覆盖的窗口小部件。在此情况下,您可能想重新考虑提供新的窗口小部件是否有意义。作为“适配器”来实现您的功能部件可能会更好,它将行为添加到窗口小部件中,而不是将自己当作窗口小部件。(JFace 查看器就遵循此模式。)
注意:此讨论已将焦点全放在通过覆盖窗口小部件来扩展窗口小部件的行为。强烈建议不要通过对窗口小部件划分子类来扩展窗口小部件,原因是它将使您的窗口小部件依赖于超类的实现。
在某些情况下,没有任何本机代码或现有窗口小部件来帮助您实现新的窗口小部件。这就意味着您自己必须使用 SWT 图形调用来绘制窗口小部件。尽管此技术可能会变得相当复杂,但是它具有可以生成完全可移植的实现的优点。
定制的已绘制的控件是通过使用下列规则来对 Canvas 或 Composite 类划分子类来实现的。
在定制的已绘制的控件中,内部状态保存在 Java 实例变量中。根据窗口小部件的要求来定义您的 API 和样式。
定制的已绘制的窗口小部件的内部实现通常涉及到下列主要任务:
在 org.eclipse.swt.custom 中实现的许多窗口小部件都使用此方法。可以在 CLabel 中找到简单的示例。
有关定制窗口小部件进一步的信息可以在使用 SWT 来创建您自己的窗口小部件中找到。