java

位置:IT落伍者 >> java >> 浏览文章

技术分析:使用Eclipse进行SWT编程(图)


发布日期:2019年05月31日
 
技术分析:使用Eclipse进行SWT编程(图)

The best way to predict the future is to invent it—Alan Kay

为什么要使用SWT?

SWT是IBM开发一套跨平台的GUI开发框架为什么IBM要创建另一种GUI呢?为什么他们不使用现有的Java GUI框架呢?要回答这些问题我需要回到Java的早期时代

Sun已经创建了一套跨平台的GUI框架 AWT (Abstract Windowing Toolkit) 这个AWT框架使用了本地窗口组件(native widgets)不过它存在LCD问题 这个LCD问题导致了它失去主要的平台特性换句话说如果平台A有窗口组件而平台B有窗口组件那么这个跨平台的AWT框架只能提供这两个集合的交集

为了解决这个问题Sun创建了一个新的框架使用模拟窗口组件(emulated widgets)来代替本地窗口组件(native widgets)这个方法解决了LCD问题同时提供了丰富的窗口组件不过也产生了其他的问题例如Swing应用程序不再和本地程序在样子上一致虽然JVM有了很大的改善 但是Swing应用程序仍然存在它们本地配对物所没有的性能问题而且Swing应用程序消耗了太多的内存故不适合用于PDA和移动电话等小型设备

IBM发现这些方法都无法满足他们的需求因此IBM创建了新的GUI库叫做SWT它解决了AWT和Swing框架中的问题SWT框架使用JNI访问本地窗口组件(native widgets)如果一个窗口组件在主机平台上不能获得那么SWT会模拟这个不能获取的窗口组件

一个SWT应用程序的基础材料

Display Shell和Widgets是一个SWT应用程序的基础材料Displays用于管理事件循环(event loops)和控制UI线程和其他线程之间的通讯Shell是应用程序中由操作系统窗体管理器来管理的窗体任何SWT应用程序都需要至少一个Display实例和个或更多的Shell实例

说明了一个SWT应用程序的不同看法第一幅图是简化的UI对象的继承图第二幅图是UI对象的包含结构第三幅图就是创建了的UI

如果一个应用程序使用多个线程每个线程使用自己的Display对象实例那么你可以通过使用静态的DisplaygetCurent()方法得到当前活跃的Display对象实例

一个Shell表示一个特别操作系统中的一个窗口一个Shell可以最大化正常化和最小化有两种类型的shell一种是顶层(toplevel)Shell作为Display的主窗口创建的另一种是依赖于其他shell的对话shell

Shell的类型是由传给Shell构造函数的style位决定的Shell的默认值是对话Shell也就是说如果没有传递任何值给构造函数参数那么创建的是默认的对话Shell如果一个Display对象作为参数那么它是顶层(toplevel)Shell

有些窗口组件(widget)的属性必须在创建时设定这些窗口组件(widget)属性叫做style bitsStyle bits是在SWT类中定义的常量如Button button = new Button( shell )当然可以通过或操作|来使用多个style bit例如要使用一个有边的按钮你需要使用SWTPUSH | SWTBORDER作为style bit参数

环境设置

开发一个SWT应用程序与开发一个Swing应用程序不同为了可以开始一个SWT应用程序的开发你需要把SWT库加到classpath中同时设置好对应的必要的环境变量

第一个需要的库是swtjar文件它位于ECLIPSE_HOME\eclipse\plugins\orgeclipseswtwin_\ws\win目录根据你使用的Eclipse版本你可能需要使用不同的目录这个swtjar文件必须加到你的classpath中为此到Project>Properies>JavaBuildPath>Libraries>Add Variable > Eclipse Home >Extend并按上述路径选择swtjar库然后单击OK

然后你可以编译SWT应用程序但是由于抛出下边所示的运行时异常无法运行它因为swtjar使用了本地库你需要设置javalibrarypath环境变量来在Java中使用本地库

educitycn/img_///jpg >

要设置javalibrarypath变量到Run> Run> Java Applicaton> New >Arguments > VM Arguments然后如何需要如下修改path把它粘贴到VM Arguments部分Djavalibrarypath=c:\eclipse\plugins\orgeclipseswtwin_\os\win\x

装载本地库

如果你需要装载应用程序使用的任何本地库你可以使用RuntimegetPlatformloadLibrary(libraryname)方法

完成这些步骤你就可以在你的eclipse环境下运行SWT程序了

你的第一个SWT应用程序

创建一个典型的SWT应用程序需要一下步骤

创建一个Display

创建一个或多个Shells

设置Shell的Layout manager

创建Shell中的widgets

开启Shell窗口

写一个事件转发循环

销毁display

你可以使用下边的代码模板来快速的运行本文中的代码片断你可以复制粘贴这些代码至合适的区域如源代码所示

educitycn/img_///jpg >

这个例子显示了一个空的窗口你可以加widget到上边的模板任何SWT应用程序需要 一个Display和一个或多个 Shells这个Shell是个合成对象;它可以容纳其他的合成对象如果没有设置shell的 layout加到Shell的widget是不能看见的Shell窗口必须 打开才能显示 事件处理循环读取并转发GUI事件如果没有事件处理循环应用程序窗口是无法显示的即使通过open()方法来打开Shell窗口让后需要在Shell被丢弃的时候销毁 Display

导入需要的库

你可以使用Source>Organize Imports菜单或者Ctrl+Shift+O来自动导入需要的库

上一篇:关于Eclipse中UI程序的线程的讨论

下一篇:在Spring中使用JDO