SWT, Swing and AWT[收藏]

SWT, Swing or AWT: Which is right for you?

 http://www-128.ibm.com/developerworks/grid/library/os-swingswt/  

---------------------------------------------------------------------------------------------------------------------------

awt/swing and swt/jface

   Swing和SWT是采用不同的机制的,AWT是Swing的前身,实际上是调用本地操作系统的控件。由于在不同的操作系统下,提供的控件是不一样的,AWT采用最小公约数的办法,只提供所有操作系统都有的控件。但后来SUN改变了做法,在Swing里除了JFrame,JWinodows,JDialog(记不太清了,好像是这几个)是调用本地操作系统的控件,其它JPanel,JButton之类的都是绘出来的,所以Swing在所有平台看起来都是一样的外观。这样保持了外观一致性,但牺牲了性能。

       IBM更喜欢AWT的实现机制,做出了SWT,SWT采用的是最大公倍数的做法。SWT大部分都是用的本地操作系统的控件,一些在windows里有的控件可能在linux下没有,对这种控件才采用自己绘制的方式。SWT采用类似JAVA虚拟机的方式,在不同的平台,有不同的开发包,我们写的java代码是一样的,但不同平台下看起来外观是不一样的,但性能提升很高。

  1. 如果你需要开发一个基于数据项的应用程序,例如表单等等,最好选择SWT。它给Windows用户(非专业人士)熟悉的Windows界面的感觉。他们容易上手。
  2. 如果你需要开发实用程序例如下载管理器,媒体播放器,p2p客户端,邮件客户端,文本编辑器等等,你可以使用SWT。这些程序主要针对非技术用户。例如Azzerus Bit Torrent Client.
  3. 如果你开发一个复杂的 gui 例如一个 BPEL 建模工具,或者一个 CAD 模型软件,你需要定制大量的小组件,这时候用Swing来定制组件要比SWT容易的多。

 -------------------------------------------------------------------------------------------------------------------------

在 Java 技术刚出现的初期,大家最感兴趣的 Java API 无疑地就是 AWT。一方面因为 JDK 1.0 时只有 AWT 称得上是一组完整的 application framework,其它 Java API 都比较偏向个别的 class,二方面是因为当时大家受尽了 MFC 的苦,希望能有一个比较好的替代品。

MFC 的兴盛期已过,目前余孽尚存,我很乐见这种不良的 API 逐渐雕零。Bruce Eckel 说得好:「MFC 是我经验过最糟糕的东西(MFC is the worst thing that I've experienced)」。少说重话的 Bruce Eckel 批评 MFC 其来有自,因为 Bruce Eckel 是对象导向程序设计的倡导者,而 MFC 正是对象导向设计失败的绝佳范例。相较于 MFC 的不良设计,AWT 在对象导向方面就好很多了,但是因为两者都采用 ripple 形式的 event model,所以两者在这方面很类似。在 JDK 1.1 版以后,整个 Java(包括 AWT)的 event model 改用较好的 delegation event model。

JDK 1.2 之后,Java 有了另一组 GUI 的 API,叫做 Swing。因为 Swing 是 lightweight 的 API,所以无所不能,不但有各式各样先进的组件,而且连组件风格都可抽换。Swing 出现之后,大家很快地就不太使用 AWT 了。我发现 lightweight 组件近年来大行其道,跨 Windows/unix/Linux 平台的 Qt 也是 lightweight 组件的套件。

不要以为 Swing 是用来取代 AWT 的,其实 Swing 是架构在 AWT 之上做出来的(Swing 有四个 heavyweight 组件),没有 AWT,也就不会有 Swing。Swing 的出现只是减少程序员直接使用 AWT 的机会,而不会让 AWT 消失。

不管你选用 AWT 或 Swing 来开发你的 GUI,最好不要同时使用两者,因为:

AWT 或 Swing 的视觉风格差异很大,混用两者感觉不协调。
Swing 的组件大部分都是 lightweight,而 AWT 的组件一律是 heavyweight,两者混在一起可能会造成 Z-Order 的错乱。(请看「探究 Z-Order」一文)
混用 AWT 和 Swing 很可能会造成 Swing 的最佳化无用武之地,结果速度比只用 AWT 或只用 Swing 都来得慢。
虽然 Swing 的组件有诸多优点,但是它有一项致命的缺点 ...「慢」。许多人开发出来的 Swing 程序执行速度很慢,但是问题不见得全都出在 Swing 上面,有可能在于程序员的程序经验不足,思虑欠周所致。遇到像这样的情况,我会建议他们把程序的某些地方改写,通常效能会有明显地改进。如果这样还是不够快,那么最后一招就是把 GUI 由 Swing 改成 AWT。

最近 AWT 又变得稍微重要起来了。IA(信息家电)产品热潮逐渐兴起,许多 IA 产品上会有 JRE,能够执行 Java 程序,例如 WinCE、PalmOS、Symbian EPOC 这三大 PDA 的 OS 都有 JRE。比起桌上型计算机,掌上型的 IA 不但内存有限、CPU 不够快、屏幕小且色彩少。这类 IA 上面的 Java 程序一定要用 AWT 来设计 GUI,因为这类装置的 JRE 根本不支持 Swing 这样耗费资源的庞然大物。

总而言之,如果你:

需要快速的 GUI,或者
需要在 IA 上开发 Java 程序
那么,你应该多花一点时间把 AWT 学好。否则,你应该直接去学 Swing,会比较实际些。
(转载文章请保留出处:Java家(www.javajia.com))

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章