使用Eclipse 进行SWT 编程 "The best way to predict the future is to invent it."— Alan Kay 1. 为什么要使用SWT? SWT 是IBM 开发一套跨平台的GUI 开发框架。为什么IBM 要创建另一种 GUI 呢?为什么他们不使用现有的Java GUI 框架呢?要回答这些问题,我需要回到 Java 的早期时代。 Sun 已经创建了一套跨平台的GUI 框架 AWT (Abstract Windowing Toolkit)。 这个 AWT框架使用了本地窗口组件(native widgets)不过它存在 LCD 问题. 这个 LCD 问题导致了它失去主要的平台特性。换句话说,如果平台A 有窗口组件 1-40 而平台B 有窗口组件 20-25,那么这个跨平台的AWT 框架只能提供这两个集合的交集。 为了解决这个问题,Sun 创建了一个新的框架使用模拟窗口组件(emulated widgets)来代替本地窗口组件(native widgets)。这个方法解决了 LCD 问题同时提供了丰富的窗口组件,不过也产生了其他的问题。例如,Swing 应用程序不再和本地程序在样子上一致。虽然 JVM 有了很大的改善, 但是Swing 应用程序仍然存在它们本地配对物所没有的性能问题。而且,Swing应用程序消耗了太多的内存,故不适合用于 PDA 和移动电话等小型设备。 IBM 发现这些方法都无法满足他们的需求。因此,IBM 创建了新的GUI 库叫做 SWT,它解决了 AWT 和 Swing 框架中的问题。SWT 框架使用JNI 访问本地窗口组件(native widgets),如果一个窗口组件在主机平台上不能获得,那么SWT 会模拟这个不能获取的窗口组件。 2. 一个 SWT 应用程序的基础材料 Display, Shell 和 Widgets 是一个 SWT 应用程序的基础材料。Displays 用于管理事件循环(event loops)和控制 UI 线程和其他线程之间的通讯。Shell 是应用程序中由操作系统窗体管理器来管理的窗体。任何 SWT 应用程序都需要至少一个 Display实例和 1 个或更多的Shell实例。 图 1.不同视角看的SW T 程序 图1 说明了一个SWT 应用程序的不同看法。第一幅图是简化的UI 对象的继承图。第二幅图是UI 对象的包含结构。第三幅图就是创建了的UI。 如果一个应用程序使用多个线程,每个线程使用自己的Display 对象实例。那么你可以通过使用静态的Display.getCurent()方法得到当前活跃的Display 对象实例。 一个Shell 表示一个特别操作系统中的一个窗口。一个Shell 可以最大化,正常化,和最小化。有两种类型的shell。一种...