java

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

Java GUI三剑客风云争霸


发布日期:2020年10月18日
 
Java GUI三剑客风云争霸

进行Java GUI(Graphical User Interface图形用户界面)编程大家或许经常徘徊在SWT/JFACE Swing AWT之间选择哪一个更合适自己?AWT作为Java语言的第一个GUI类库包在这三者之间中年龄最长可谓开国元勋老二Swing兼容AWT同时又对AWT进行了改进可谓站在前辈的肩膀上自然就会看的远了老三SWT/JFace则只能用不走寻常路来形容它SWT/JFace采取了与AWT和Swing完全不同的技术路线这三剑客之间究竟孰优孰劣且听下文分解

穷途末路的AWT

AWT(Abstract Windowing Toolkit)中文译为抽象窗口工具包是Java提供的用来建立和设置Java的图形用户界面的基本工具AWT由Java中的javaawt包提供里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类这些类被称为组件(components)

抽象窗口工具包 (Abstract Windowing Toolkit) (AWT)是Java的平台独立的窗口系统 图形和用户界面器件工具包AWT是Java基础类 (JFC)的一部分为Java程序提供图形用户界面(GUI)的标准API

AWT提供了Java Applet和Java Application中可用的用户图形界面GUI中的基本组件(components)由于Java是一种独立于平的程序设计语言但GUI却往往是依赖于特定平台的Java采用了相应的技术使得AWT能提供给应用程序独立于机器平台的接口这保证了同一程序的GUI在不同机器上运行具有类似的外观(不一定完全一致)

抽象窗口工具包AWT (Abstract Window Toolkit) 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集AWT可用于Java的applet和applications中它支持图形用户界面编程的功能包括 用户界面组件事件处理模型图形和图像工具包括形状颜色和字体类布局管理器可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关数据传送类可以通过本地平台的剪贴板来进行剪切和粘贴

然而Java推出的时候AWT作为Java最弱的组件受到不小的批评最根本的缺点是AWT在原生的用户界面之上仅提供了一个非常薄的抽象层例如生成一个AWT的复选框会导致AWT直接调用下层原生例程来生成一个复选框不幸的是一个Windows平台上的复选框同MacOS平台或者各种UNIX风格平台上的复选框并不是那么相同这种糟糕的设计选择使得那些拥护Java一次编写到处运行 (write once run anywhere)信条的程序员们过得并不舒畅因为AWT并不能保证他们的应用在各种平台上表现得有多相似一个AWT应用可能在Windows上表现很好可是到了Macintosh上几乎不能使用或者正好相反年代程序员中流传着一个笑话:Java的真正信条是一次编写到处测试 (write once test everywhere)导致这种糟糕局面的一个可能原因据说是AWT从概念产生到完成实现只用了一个月

在第二版的Java开发包中AWT的器件很大程度上被Swing工具包替代Swing通过自己绘制器件而避免了AWT的种种弊端Swing调用本地图形子系统中的底层例程而不是依赖操作系统的高层用户界面模块Swing的出现宣告了AWT的穷途末路目前几乎看不到AWT在GUI上的应用了

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++语言程序运行速度的//于是采用JBuilder进行开发的朋友们经常可以看到JBuilder灰屏(窗体上组件还没有画出来)的景象正是因为Swing的蜗牛速度因此在Java推出这么多年来很少能够看见比较成熟的Swing桌面应用(JBuilder算是其中最成功的一个了但是现在随着Eclipse的崛起JBuilder的发展也是举步维艰)

总之Swing在AWT的基础上很好的解决了跨平台观感不一的问题并且提供了比AWT更为丰富的组件(AWT连树形控件表格控件都没有)和强大的功能却因为其过于复杂难以上手和让人无法接受的速度让广大程序员对其失去了好感这不能不让人惋惜

SWT/JFace——众里寻她千百度

就在Java在中间件市场(JEE)以及web应用(JSP/Sevlet)上大放异彩的时候AWT的穷途末路Swing的饱受病诟这一切似乎让Java的GUI开发沉寂的像一潭死水

寻寻觅觅冷冷清清凄凄惨惨戚戚啊!

SWT/JFace象一股清新的风吹入了Java的GUI开发领域为这个沉闷的领域带来了勃勃生机虽然SUN不接纳SWT/JFace作为Java中的一种图形API标准但它虽然借着Eclipse的优异表现以不可阻挡之势向前发展着终于可以用SWT/JFace轻松的开发出高效率的GUI程序且拥有标准的Windows外观Eclipse软件就是基于SWT/JFace构建的大家看看Eclipse就知道SWT有多么的棒

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需运行在G以上内存的机器上而Eclipse则可以在M内存的机器上跑的很欢SWT/JFace具有比AWT更为丰富的控件比Swing更为快捷的速度

任何事务都不可能十全十美SWT/JFace也不例外SWT/JFace的缺点主要在于两点() 不是Java语言标准() 某些平台并不支持

总结——长江后浪推前浪

滚滚长江东逝水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开发的水平

上一篇:开发框架 hibernate3.0 开发实例

下一篇:结合Spring2.0和ActiveMQ进行异步消息调用