“标准小窗口工具箱”(SWT)是 Java 开发者的小窗口工具箱, 它提供可移植的 API,并与底层本机 OS GUI 平台紧密集成。
许多低级别的用户界面编程任务是在 Eclipse 平台的较高层处理的。例如,用户界面添加项的 plugin.xml 标记指定菜单和工具栏内容,而不需要进行任何 SWT 编程。另外,JFace 查看器和操作实现了应用程序与小窗口之间的普通交互作用。然而,底层 SWT 体系结构和设计原理方面的知识对于了解平台的其它部分是如何工作的是很重要的。
小窗口工具箱设计中的常见问题是可移植工具箱与平台集成之间的平衡。Java AWT(抽象窗口工具箱)为较低级别的小窗口(例如,列表、文本和按钮)提供了平台集成的小窗口,但是没有提供对较高级别的平台组件(例如,树或丰富文本)的访问权。这强制应用程序开发者进入“最小公分母”情况,在这种情况下,他们只能使用所有平台上都可用的小窗口。
Swing 工具箱试图通过提供高级别小窗口(例如,树、表和文本)的非本机实现来解决此问题。这提供了许多功能,但使得在 Swing 中开发的应用程序因为不同而显得很突出。平台外观模拟层帮助应用程序看起来更象平台, 但是用户交互有很大不同,足够引起注意。这使得很难使用模拟的工具箱构建应用程序与为特定 OS 平台专门开发的包装好的应用程序竞争。
SWT 通过定义在所有受支持的平台上提供的常见可移植 API 来解决此问题,并尽可能使用本机小窗口在每个平台上实现该 API。这允许工具箱在所有平台上维护一致的编程模型时立即反映底层 OS GUI 外观中的任何更改。
“最小公分母”问题是由 SWT 按几种方式来解决的:
平台集成严格说来并不是外观问题。通过紧密集成,能够与本机桌面功能部件(例如,拖放)交互作用、与 OS 桌面应用程序集成以及使用利用 OS 组件模型(例如,Win32 ActiveX)开发的组件。
SWT ActiveX 支持在文章 ActiveX Support in SWT 中讨论。
通过提供本机 OS 开发者熟悉的实现,同时在代码本身中获得了一致性。SWT 为每个平台提供了采用 Java 的不同实现,而不是隐藏本机 C 语言代码中的 OS 区别或试图在 Java 实现中构建可移植和非可移植的层。
一个重要的实现规则是使用 C 语言的本机程序与对 OS 的调用进行一一映射。Windows 程序员将立即识别 Windows 上的 SWT 工具箱的实现,因为它使用直接映射至在 C 语言中使用的系统调用的本机程序。没有任何“平台幻数”隐藏在 C 语言代码中。平台开发者可以查看代码,并确切地知道哪些平台调用是由工具箱执行的。这极大地简化了调试。如果在调用本机方法时发生了故障,则从 C 语言代码中使用相同参数来调用平台 API 将产生相同的故障。(可以在 Java 本机程序的 SWT 实现战略中找到关于此问题的完整讨论。)