编程,大家或许经常徘徊在SWT/JFACE, Swing, AWT之间选择,哪一个更合适自己?
AWT作为Java语言的第一个GUI类库包,在这三者之间中年龄最长,可谓开国元勋;老二Swing,兼容AWT,同时又对AWT进行了改进,可谓站在前辈的肩膀上,
2. Swing——想说爱你不容易
Java Swing是Java Foundation Classes(JFC)的一部分,它是试图解决AWT缺点的一个尝试。从这一点上来说,Swing可以说是站在前人(以AWT的表现,实在很难称之为巨 人)的肩膀上了。SWING解决了AWT的很多缺点。相对于AWT, Swing是轻量级元件。SWING 提供许多比AWT更好的屏幕显示元素。它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT。 它们是JFC的一部分。 它们支持可更换的观感和主题(各种操作系统默认的特有主题),然而Swing不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们。这意味着你可以 在任意平台上使用JAVA支持的任意观感。 轻量级元件的缺点则是执行速度较慢,优点就是可以在所有平台上采用统一的行为。
在Swing 中,Sun 开发了一个经过仔细设计的、灵活而强大的 GUI 工具包。其中大量应用了MVC模式,这大大增加了Swing的灵活性。笔者曾经做过一个大型的大型C/M/S (Client/Middleware/Server)项目,其中客户端UI采用的就是Swing,可以说,Swing几乎可以实现所有的你能够想到效果,只要你技术足够精湛,都可以实现。这也许在某些高手看来,是Swing一个很明显的优势。 然而Swing的这种设计确苦了Java的初学者或者面向对象程序设计造诣不深的程序员。灵活就意味这功能强大,功能强大就意味着复杂,对于一般的程序员 来说,Swing太复杂了,以至于他们在还不了解Swing的时候就已经放弃了选择Swing,或者失去净下心来继续学下去的毅力,最后写出来的只能是一 堆垃圾代码。
如果说功能强大但是过于复杂会让人对Swing想爱确不知道怎么去爱的话,那么Swing的低效则会让大多数的程序员感叹——Swing,想说爱你不容 易。由于Swing是轻量级组件,因此Swing中的每一个组件都是采用Java身的画点、画线的函数画出来的,并没有调用操作系统组件。Java字节码 的运行速度大概是同等条件下C/C++语言程序运行速度的1/10~1/5。于是,采用JBuilder进行开发的朋友们经常可以看到JBuilder灰 屏(窗体上组件还没有画出来)的景象。正是因为Swing的蜗牛速度,因此在Java推出这么多年来,很少能够看见比较成熟的Swing桌面应用 (JBuilder算是其中最成功的一个了,但是现在随着Eclipse的崛起,JBuilder的发展也是举步维艰)。
总之,Swing在AWT的基础上很好的解决了跨平台观感不一的问题,并且提供了比AWT更为丰富的组件(AWT连树形控件、表格控件都没有)和强大的功能,却因为其过于复杂难以上手和让人无法接受的速度让广大程序员对其失去了好感。这不能不让人惋惜。
3. SWT/JFace——众里寻她千百度
就在Java在中间件市场(J2EE)以及web应用(JSP/Sevlet)上大放异彩的时候,AWT的穷途末路、Swing的饱受病诟,这一切似乎让Java的GUI开发沉寂的像一潭死水。
寻寻觅觅,冷冷清清,凄凄惨惨戚戚啊!
SWT/JFace象一股清新的风吹入了Java的GUI
开发领域,为这个沉闷的领域带来了勃勃生机。虽然SUN不接纳SWT/JFace作为Java中的一种图形API标准,但它虽然借着Eclipse的优异表现,以不可阻挡之势向前发展着。终于可以用SWT/JFace轻松的开发出高效率的GUI程序,且拥有标准的Windows外观,Eclipse软件就是基于SWT/JFace构建的,大家看看Eclipse3.2就知道SWT有多么的棒。
点击查看大图
图1:SWT/JFace的代表作——Eclipse界面
在此有必要解释一下SWT与JFace的区别,JFace其实是在SWT的基础上,采用MVC模式进行了封装而形成的一个新的类库,这一封装,大大简化了 采用SWT开发Java图形用户界面的难度。在SWT推出后不久,出现了一个名为SWT Designer的Eclipse插件,使用该插件可以像采用Visual Studio .NET开发Window图形用户界面一样简单,可以采用可视化拖拽的方式进行。不要以为这是一个很小的进步,要知道用Java写GUI程序能够简单到这种程度,这在以前可是想都不敢想的事情。.NET平台之所以成功,很大程度上与它的IDE——Visual Studio .NET,优异的表现有关,而Visual Studio .NET最值得称道的就是它的可视化设计模式。
SWT/JFace直接调用了操作系统的 图形库,从而使得Java应用程序的Look & Feel 与操作系统的习惯完全一致;更为重要的是,SWT/JFace采用有限调用本地方法(控件),只有当本地找不到所需要的控件时,才进行模拟。对本地方法的 直接调用大幅度的提高了基于SWT/JFace的Java应用程序的运行速度。相信使用过JBuilder和Eclipse的开发人员会有切身的体会。一 般来说,基于Swing的JBuilder需运行在1G以上内存的机器上,而Eclipse则可以在512M内存的机器上跑的很欢。SWT/JFace具有比AWT更为丰富的控件,比Swing更为快捷的速度。
任何事务都不可能十全十美,SWT/JFace也不例外。SWT/JFace的缺点主要在于两点:(1) 不是Java语言标准;(2) 某些平台并不支持。
4. 总结——长江后浪推前浪
滚滚长江东逝水,Java GUI开发三剑客,先后登上了历史的舞台。AWT作为Java第一个GUI类库,实现Java GUI开发从无到有的突破,尽管后来表现不佳,目前已经基本退出历史的舞台,但是其历史功绩是不容被抹杀的;Swing系出名门,是Java标准的一部 分,并且站在AWT的肩膀上进行了许多改进,但是其过于复杂,且效率低下,目前也是饱受病诟,并不被广大程序员所接受;SWT/JFace作为后起之秀, 在效率上、易用性上以及美观上都进行了改进,可以说是这三剑客中表现最为优秀的。最为难能可贵的是,SWT/JFace并不是Java标准的一部分,却能 被广大程序员所接受,足见其优秀。
Java GUI开发作为Java技术系列中最为薄弱的环节,距离Windows平台的.NET GUI开发还是有很大的差距。但是相信在类似Java GUI开发三剑客这样的新技术的推动下,总有一天,Java GUI开发还是可以接近或者达到Windows平台的.NET GUI开发的水平。