对Swing、AWT和SWT的认识
摘要:现在java提供了除swing之外的图形GUI开发工具,那么他们之间有什么区别呢?本文主要分析了Swing,AWT和SWT他们之间的区别。
1、 三者的概述:
AWT(Abstract Window Toolkit) 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,基于一个对等体实现的。AWT可用于Java的applet和applications中。它支持图形用户界面编程的功能包括: 用户界面组件;事件处理模型;图形和图像工具,包括形状、颜色和字体类;布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。
SWT("Standard Widget Toolkit",是一个最初由IBM开发的工具包,现在由Eclipse基金会维护。)是一个独立于平台的,也是基于一个对等体实现的,可以脱离 Eclipse 框架单独使用的图形组件,用JNI技术提供与本机系统同样的用户界面组件的观感,较好的运行效率,稳定的平台表现。一个SWT应用程序的基本组成部分为显示界面(Display)、命令界面(Shell,使命令进入并使运行初始化)和窗口部件(Widgets)。Display负责管理事件循环和控制UI线程和其他线程之间的通讯。Shell是应用程序中被操作系统窗口管理器管理的窗口。每个SWT应用程序至少需要一个Display和大于等于1个的Shell实例。
Swing是基于AWT的架构之上的,在不改变大量的程序代码前提下允许程序中每个组件观感的变化。支持可更换观感技术的引入允许Swing组件在模拟原生组件外观的同时又保持了平台独立的优点。
2、 三者的区别
AWT、SWTt都依赖底层平台,都基于对等体实现的,在不同的操作系统上开发出来的程序显示效果不一样,SWT提供比AWT更为丰富的组件集;而Swing对底层平台的依赖很少,所以给不同用户一致的感觉,还拥有一个丰富、便捷的用户界面元素集合。由于AWT和SWT都持有对本地组件的引用,它们必须以正确的方式释放这些引用以避免内存泄露和JVM崩溃。AWT将绝大多数资源管理任务交给系统,不过这使得AWT的实现复杂化了。一旦它实现了,开发者很少有机会犯错误并使他们的程序崩溃。而SWT是采用另外的方法,它有一条法则就是:谁创建,谁释放。因此开发者必须谨慎地显式调用dispose方法释放每一个由他创建的组件和资源。这虽然简化了SWT的实现模型,但把开发者摆在了因错误编码而易于造成程序崩溃这一风险之上。
awt只提供所以操作系统都有的控件,即全部调用的是本地操作系统的控件;Swing只是窗口和框架等的顶层的组件调用操作系统控件,大部分都是使用java代码来模拟的;swt大部分是用的本地操作系统的控件,有些在别的操作系统的控件要经过自己的绘制。Swing和SWT都在实现上都使用模拟。SWT是模拟平台上缺失的组件。区别是SWT的模拟更像是AWT的Canvas实现的模拟。SWT的Composite类有它自己在操作系统中相应的对等体。它从自己的对等体中获得所有它所需要的资源如图形处理的对象,字体和颜色等。它直接从操作系统获取所有的事件并进行处理。然而,Swing组件在操作系统中没有相应的对等体。它只是一块顶层容器中的逻辑区域,实际上它从顶层容器的对等体中借用资源。Swing的事件并不是底层系统产生的事件。它们实际是由顶层容器处理AWT事件所产生的伪事件。另一个不同之处是Swing组件的z-order系统是来自于AWT组件的。Swing是基于awt的架构之上的,故Swing组件与顶层AWT容器共享一个对等体。因此,Swing组件也和顶层容器有相同的z-order。SWT和AWT组件都有不同于顶层容器的z-order,通常是高于顶层容器。故而如果AWT组件和Swing组件混合在一起的话,Swing组件将可能被AWT组件遮住。当操作系统开始更新UI的时候,顶层容器和Swing组件总是先于AWT组件绘制。当它们完成绘制,AWT组件会覆盖Swing可能绘制过的地方。因此不提倡Swing和AWT组件的混用。如果有一个浮动的Swing组件如菜单,AWT组件很可能遮盖菜单。