"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 说明了一个swt应用程序的不同看法。第一幅图是简化的ui对象的继承图。第二幅图是ui对象的包含结构。第三幅图就是创建了的ui。
如果一个应用程序使用多个线程,每个线程使用自己的display对象实例。那么你可以通过使用静态的display.getcurent()方法得到当前活跃的display对象实例。
一个shell表示一个特别操作系统中的一个窗口。一个shell可以最大化,正常化,和最小化。有两种类型的shell。一种是顶层(top-level)shell作为display的主窗口创建的,另一种是依赖于其他shell的对话shell。
shell的类型是由传给shell构造函数的style位决定的。shell的默认值是对话shell。也就是说,如果没有传递任何值给构造函数参数,那么创建的是默认的对话shell。如果一个display对象作为参数,那么它是顶层(top-level)shell。
有些窗口组件(widget)的属性必须在创建时设定。这些窗口组件(widget)属性叫做style bits。style bits是在swt类中定义的常量。如button button = new button( shell,
3. 环境设置
开发一个swt应用程序与开发一个swing应用程序不同。为了可以开始一个swt应用程序的开发,你需要把swt库加到classpath中,同时设置好对应的必要的环境变量。
第一个需要的库是swt.jar文件,它位于eclipse_home/eclipse/plugins/org.eclipse.swt.win32_2.1.0/ws/win32目录。根据你使用的eclipse版本,你可能需要使用不同的目录。这个swt.jar文件必须加到你的classpath中,为此到project->properies->javabuildpath->libraries->add variable -> eclipse home ->extend并按上述路径选择swt.jar库,然后单击ok。
然后,你可以编译swt应用程序,但是由于抛出下边所示的运行时异常,无法运行它,因为swt.jar使用了本地库。你需要设置java.library.path环境变量来在java中使用本地库。

要设置java.library.path变量,到run-> run...-> java applicaton-> new ->arguments -> vm arguments。然后,如何需要,如下修改path,把它粘贴到vm arguments部分。-djava.library.path=c:/eclipse/plugins/org.eclipse.swt.win32_2.1.0/os/win32/x86
装载本地库
如果你需要装载应用程序使用的任何本地库,你可以使用runtime.getplatform.loadlibrary("libraryname")方法。
完成这些步骤,你就可以在你的eclipse环境下运行swt程序了。
4. 你的第一个swt应用程序
创建一个典型的swt应用程序需要一下步骤:
创建一个display
创建一个或多个shells
设置shell的layout manager
创建shell中的widgets
开启shell窗口
写一个事件转发循环
销毁display
你可以使用下边的代码模板来快速的运行本文中的代码片断。你可以复制粘贴这些代码至合适的区域。如源代码1所示:

这个例子显示了一个空的窗口。你可以加widget到上边的模板。任何swt应用程序需要 一个display和一个或多个 shells。这个shell是个合成对象;它可以容纳其他的合成对象。如果没有设置shell的 layout,加到shell的widget是不能看见的。shell窗口必须 打开才能显示。 事件处理循环读取并转发gui事件。如果没有事件处理循环应用程序窗口是无法显示的。即使通过open()方法来打开shell窗口。让后,需要在shell被丢弃的时候销毁 display。
导入需要的库
你可以使用source->organize imports菜单或者ctrl+shift+o来自动导入需要的库。
闽公网安备 35060202000074号