【IT168 技术文章】自从 Java语言出现的早期到现在,图形和用户界面功能已取得了飞跃式的发展。Java2平台包含一个复杂的跨平台的用户界面体系结构,它的组成包括众多的高级组件、一个先进的,功能丰富的,独立于设备的图形系统和许多的多媒体扩展。在本文中,我们将探究这个进步,详细审视当前1.3 版本的功能,最后展望一下未来,看看发行版 1.4会提供些什么。请点击文章顶部或底部的 讨论,在论坛与本文作者和其他读者分享您对本文的看法。
在 Java 2 平台发行之前,抽象窗口工具包(Abstract Window Toolkit,AWT)是 Java 平台的图形功能的范围。例如 Swing 等各种技术都是作为可选的扩展被引入的。在 Java 2 平台上,这些扩展中的大部分都可以在平台的核心中找到它们的一席之地,成为 Java 基础类(Java Foundation Classes,JFC)的一部分。JFC 指的是包含在 Java 2 平台内的一整套图形和用户界面技术,包括 AWT 和 Swing 等。在本文中,我们将讨论 JFC 的每个主要组件,并讨论一些可选的扩展。
JFC 的核心:Swing
Swing 是一个带有一套丰富组件的 GUI 工具包,它组成了 JFC 的用户界面功能的核心部分。它不仅是 AWT 所提供的组件的替代品,并且在这些组件的基础上有了很大进步。
当集成有优先权时
在 JDK 首次发行时,与本机平台的集成被认为具有优先权,于是 AWT 提供了一些组件,这些组件使用各平台的本机组件(在 Java 编程术语中,这些被称为 重量级组件)来实现。例如,在 UNIX 平台上, java.awt.Button 类是用窗口小部件 Motif PushButton 实现的。
相同的 Java 应用程序在每个平台上都有不同的外观,但本意是不同的实现在功能上是等同的。当然,这也是问题开始的地方。在简单的界面里,这种等同是真的。但随着复杂性的增加,情况就不一样了,这只是因为组件的不同,而且在某些情况下,不管修正了多少错误,并且 AWT 的部件被重写了多少次,它们总会表现得有一点不同。
由于将优先权赋予集成而产生的另一个问题是功能性问题。AWT 只提供了有限的一套组件,是因为“最小公分母”方法 ― 只有当一个特殊的组件或功能在每个平台上都可用的时候才能够被提供。一个典型的示例就是鼠标键。在以前的 JDK 1.0.2 中,是无法区分鼠标键的点击的,因为 Macintosh 只有一个鼠标键,所以其它的每个平台都要表现得好像自己也只支持一个鼠标键一样。
语言自身已经变得不只是一种平台了,GUI 也正在朝着在所有平台上都有相同的外观和行为这种方向转变。为了实现这个目标,本机组件必须尽量地丢弃。但是,显然一些本机代码还是必需的。如果不包含 X System Window 的调用,您就不能在 UNIX 上显示一个窗口。
现在来看一下 Swing,它使用 AWT 的一个子集来实现这个目标,这个子集包括基本画图操作和 java.awt 包中的某些类(包括 Container 、 Window 、 Panel 、 Dialog 和 Frame )。
所有可能的方法中最好的
Swing 没有完全遵循“Java 语言作为一个平台”的路线。相反,它通过提供一个可以返回本机平台的桥梁,把两种方法的精华部分结合起来了。
建立这个桥梁的机制被称为 可插式 Look-and-Feel(它很接近主题的概念,在 linux 社区中非常流行)。每一个 Swing 组件都有一个自己的功能模型和一个独立的外观(look-and-feel),这可以预先设置或在运行时更改。
Swing 为 Windows 平台和 Motif 平台分别提供一个 Java look-and-feel(以前称为 Metal),同时为 Macintosh 平台提供一个 Java look-and-feel(作为额外选项)。平台的 look-and-feel 不像 AWT 一样使用平台的本机组件。相反,它们使用 轻量级组件,有和本机组件一样的外观。这对于功能性来说是好的,但在外观上或行为上总有一些不同,所以复杂的界面永远不会和使用本机组件的界面完全相同。
另外,您可以制作自己的 look-and-feel。当您为高度专门化的应用程序制作一个 look-and-feel,或为一系列应用程序提供一个共同的 look-and-feel 时,这是一种强大的功能。
图 1、图 2 和图 3 展示了每一个主要的 look-and-feel 的屏幕。
图 1. Java look-and-feel

图 2. Windows look-and-feel 
图 3. Motif look-and-feel 
独立于平台的拖放
JDK 1.1 增加了一个通用机制,这种机制放在 java.awt.datatransfer 包中,实现了应用程序之间和应用程序内部的数据传输,以及对系统剪贴板的操作能力。
Java 2 版本引入了 java.awt.dnd 包。此包建立在数据传输的机制上,提供了拖放功能,这些功能可以在一个单独的 Java 应用程序内或两个 Java 应用程序之间以一种平台无关的方式执行。为了集成本机平台的拖放功能,它也可以以一种平台 相关的方式运行。
使用拖放(Drag and Drop,DND)API 很具有挑战性,因为它要操作在很高的抽象度上来支持它工作的不同方式,同时也因为它被设计成操作被 java.awt.datatransfer.Transferable 接口所指定的任意数据类型。让我们看一个示例。
DND API 如何工作
首先,需要一个 DragSource 对象来初始化拖放操作。该对象被用于创建一个 DragGestureRecognizer ,它规定标明拖动操作开始点的事件。例如,在一个特定组件上按下鼠标左键然后移动鼠标。
系统一识别到此动作,可利用 DragSource 对象通过要传输的信息来定义操作的开始点。
下一步,拖动操作的有效目的地可通过向 DropTarget 对象传送一个组件或者调用 Component 的新的 setDropTarget() 方法来定义。
实现 DropTargetListener 接口的类可用来响应拖放操作中可能出现的各种事件。主要事件是放操作,一个 DropTargetDropEvent 对象被传送给该操作。可向该对象查询被拖动的数据的类型。
侦听器可以拒绝或者接受拖动并传输数据,完成拖放操作。
方便残疾人士:辅助选项(Accessibility)
Java 应用程序配备有 JFC Accessibility API(JFC 辅助选项 API),所以可以被具有各种能力的用户访问,包括视力、听力或行动不便的用户。这些可能包括不能分辨视觉或听觉信号或者不能操作定位设备。
辅助选项支持的两大重要功能就是屏幕读取器和屏幕放大镜。屏幕读取器允许用户通过创建界面的 off-screen 表示,并将其传送到一个语音合成器或盲文终端来与 GUI 进行交互。屏幕放大镜提供一个屏幕的放大窗口,典型情况下是正常大小的 2 到 16 倍。它们通常不断跟踪指针的移动和输入焦点的改变,然后相应地调整放大的窗口。另外,象平滑字体这样的技术可能会用于生成更清晰的图像。
Java Accessibility Bridge(Java 辅助选项 Bridge)
一些主机系统,如 Microsoft Windows,提供它们自己的辅助选项功能。缺省情况下,Java 应用程序并不完全支持它们。例如,对于本机应用程序,屏幕放大器探测输入焦点何时转换到另一个不同的用户界面组件(例如通过使用 Tab 键),然后调整放大的屏幕部分,来显示当前拥有输入焦点的组件。
然而,Swing 应用程序使用的是轻量级的组件,操作系统将这些组件作为图像处理,而不作为离散的组件来处理。这就意味着屏幕放大器不能象本机应用程序那样在输入焦点中跟踪发生的改变。
这正好就是面向 Windows 的 Java Accessibility Bridge 所要解决的问题。它在与轻量级组件有关的事件和本机系统事件之间建立一个映射。使用这个 Bridge,支持 Accessibility API 的 Java 应用程序就可以与 Windows 辅助选项支持完全集成。