可访问性
创建一个残疾人可以访问的 GUI 是非常重要的。Swing 为实现具有可访问性的 GUI 提供了丰富的基础设施和 API。这种支持是单独的,但是如果主机上具有可访问性支持,那么它们应该集成在一起。
与 AWT 一样,Swing 可以支持 GUI 组件的自动销毁。Swing 还可以支持 AWT 的自底向上和自顶向下的构建方法。
与 AWT 不同,Swing 组件不是线程安全的,这意味着您需要关心在应用程序中是哪个线程在更新 GUI。如果在使用线程时出现了错误,就可能会出现不可预测的行为,包括用户界面故障。有一些工具可以帮助管理线程的问题。
与 AWT 类似,Swing 的一个优点是,它也是 Java 技术的一种标准配置。这意味着您不需要自己来安装它了。不幸的是,Swing 已经有了很大的变化,因此它很容易变得依赖于最新版本的 Java 语言所提供的特性,这可能会强制用户更新自己的 Java 运行时环境。
与 AWT 的概念相比,SWT 是一个低级的 GUI 工具包。JFace 是一组用来简化使用 SWT 构建 GUI 的增强组件和工具服务。SWT 的构建者从 AWT和Swing 实现中学习了很多经验,他们试图构建一个集二者优点于一体而没有二者的缺点的系统。从很多方面来说,他们已经成功了。
SWT 也是基于一个对等体实现的,在这一点上它与 AWT 非常类似。它克服了 AWT 所面临的 LCD 的问题,方法如下:定义了一组控件,它们可以用来构建大部分办公应用程序或开发者工具,然后可以按照逐个主机的原则,为特定主机所没有提供的控件创建模拟控件(这与 Swing 类似)。对于大部分现代主机来说,几乎所有的控件都是基于本地对等体的。这意味着基于 SWT 的 GUI 既具有主机外观,又具有主机的性能。这样就避免了使用 AWT和Swing 而引起的大部分问题。特定的主机具有一些低级功能控件,因此 SWT 提供了扩充(通常是模拟的)版本(通常使用 “C” 作为名字中的第一个字母),从而可以产生更一致的行为。
在对等体工作方式上,SWT 与 AWT 不同。在 SWT 中,对等体只是主机控件上的一些封装程序而已。在 AWT 中,对等体可以提供服务来最小化主机之间的差异(就是在这里,AWT 碰到了很多行为不一致的问题)。这意味着 SWT 应用程序实际上就是一个主机应用程序,它必然会全部继承主机的优点和缺点。这还意味着 SWT 不能完全实现 WORE 的目标;它更像是一种 WOTE 解决方案。这就是说,SWT 尽管不如 Swing 那么优秀,但是它在创建可移植解决方案方面是很杰出的。
正如您可以看到的一样,这些组件集比 AWT 提供的组件集更为广泛,与 Swing 组件集相比也毫不逊色。
与 AWT和Swing 布局管理器类似,SWT 也提供了非常丰富的布局部件集。布局系统与嵌套容器一起使用,可以生成所需要的任何布局算法。所有这 3 个 GUI 库也可以支持对部件的定位实现绝对控制。SWT 没有等效的 BorderLayout 部件,这一点非常令人失望。FormLayout 对于创建表单基本输入来说非常好用。我认为 SWT 的布局机制比 AWT/Swing 布局部件集的使用更难学习。
与 AWT和Swing 事件系统一样,SWT 提供了非常丰富的事件集。尽管这些事件并不能与 AWT/Swing 的事件一一对应(例如 AWT和Swing 的按钮都会产生 ActionEvent 事件,而 SWT 的按钮产生的则是 SelectionEvent 事件),但是它们通常都是等价的。
很多 Swing 组件,例如 JTable,都有自己的模型。对应的 SWT 控件(例如 Table)则没有;不过它们有自己的条目。条目通常用来限制显示文本或通常很小的图像(例如图标)。为了提供一种类 Swing 的模型接口,SWT 使用了 JFace ContentProviders。这些组件可以在应用程序提供的模型(例如 List 或 Table 使用的 java.util.Array )和用作视图的控件之间充当一个桥梁。为了将任意模型对象格式化成条目,SWT 使用了 JFace LabelProviders,它们可以为任何模型对象生成一个文本或图标格式。这可以对复杂模型对象的混合显示进行限制。其他类似组件,例如 ColorProviders 和 LabelDecorators,可以增强对这些条目的显示。对于 Tables 的特例来说,SWT 提供了 CellEditor,它可以临时将任意 SWT 控件链接到一个 Table 单元格上,从而当作这个单元格的编辑器使用。
SWT 不支持 GUI 控件的自动销毁。这意味着我们必须显式地销毁所创建的任何控件和资源,例如颜色和字体,而不能利用 API 调用来实现这种功能。这种工作从某种程度上来说得到了简化,因为容器控制了其子控件的自动销毁功能。
使用 SWT 只能自顶向下地构建 GUI。因此,如果没有父容器,子控件也就不存在了;通常父容器都不能在以后任意改变。这种方法不如 AWT/Swing 灵活。控件是在创建时被添加到父容器中的,在销毁时被从父容器中删除的。而且 SWT 对于 style 位的使用只会在构建时进行,这限制了有些 GUI 控件的灵活性。有些风格只是一些提示性的,它们在所有平台上的行为可能并不完全相同。
与 Swing 类似,SWT 组件也不是线程安全的,这意味着您必须要关心在应用程序中是哪个线程对 GUI 进行了更新。如果在使用线程时发生了错误,就会抛出异常。我认为这比不确定的 Swing 方法要好。有一些工具可以帮助管理线程的问题。
如果所支持的操作系统提供了可访问性服务,那么 SWT GUI 通常也就具有很好的可访问性。当默认信息不够时,SWT 为程序员提供了一个基本的 API 来指定可访问性信息。
SWT 提供了一个有限的图形环境。到目前为止,它对于 Java2D 和 Java3D 的支持还不怎么好。Eclipse 使用一个名为 Draw2D 的组件提供了另外一种单独的图形编辑框架(Graphical Editing Framework,GEF),它可以用来创建一些绘图应用程序,例如 UML 建模工具。不幸的是,GEF 难以单独(即在整个 Eclipse 环境之外)使用。
与 AWT和Swing 不同,SWT 和 JFace 并不是 Java 技术的标准配置。它们必须单独进行安装,这可以当作是 Eclipse 安装的一部分,也可以当作是单独的库进行安装。Eclipse 小组已经使它的安装变得非常简单,并且 SWT 可以与 Eclipse 分开单独运行。所需要的 Java 档案文件(JAR)和动态链接库(DLL)以及 UNIX® 和 Macintosh 上使用的类似库可以从 Eclipse Web 站点上单独下载。JFace 库需要您下载所有的 Eclipse 文件,并拷贝所需要的 JAR 文件。在下载所需要的文件之后,我们还需要将这些 JAR 文件放到 Java CLASSPATH 中,并将 DLL 文件放到系统 PATH 中。
【编辑推荐】