java awt原理_Java中AWT、Swing与SWT三大GUI技术的原理与效率差别

看了一下对Java GUI讨论的帖子,因此写了一篇文章来阐述一下各类GUI技术的优劣。

Java世界中,目前最知名的三大GUI库分别是:

一、AWT(Abstract Window Toolkit)抽象窗口工具包库,包含于全部的Java SDK中

二、Swing高级图形库,包含于Java2 SDK中

三、来自IBM Eclipse开源项目的SWT(Standard Widget Toolkit)标准窗口部件库,不包含于JDK中,须要从Eclipse单独下载

1、AWT的原理:小巧却简陋的GUI系统

AWT出现于Java 1.x中,是Java初期所内置的一种面向窗口应用的库。AWT使用的技术是对等设计模式(即Peer),其结构关系参见下图。

48e1530001ab412bb6b5557d.html

从这幅类关系图很容易看出AWT的技术实现和Peer设计模式。图中,黄色的类是java.awt包中的类,浅灰色部分是Java虚拟机部分,而深灰色则是Windows平台。

awt的重点是对等Peer设计模式。所谓Peer对等设计模式就是将awt控件直接对应到运行平台上的一个相似或者等同控件上。好比图中的Button类就是对应了深灰色的Windows的标准Button功能。

对等模式用于在两个控件间之间创建一个相互做用的联系,而充当纽带的则是Java虚拟机和虚拟机-GDI的接口(以Windows为例子)。因此,咱们能够看出,awt首先须要通过通用的Java技术来控制图形、事件等,而后Java虚拟机再将请求传送到具体的平台图形和控件接口去交互。

对等模式的效率并不很高,由于AWT经过了虚拟机和虚拟机-GDI这两个层次来完成一个操做,通过的层次系统越多,速度和效率就越慢。并且Peer对等模式有一个致命的弱点:移植性很是差!

这就是Sun为何要用Swing来诱惑咱们离开AWT的主要缘由。由于既然是对等模式,那么AWT就必须使用全部图形操做系统的图形接口功能的交集,由于 AWT的接口只有一套,因此,为了保证移植性,就只能使用全部系统都可以支持的最少特性。于是咱们常常能够听见有人抱怨AWT的功能太少,图形太难看等等,这是为了保证移植性而做出的牺牲。

2、猛犸巨兽的诞生-Swing

从Java2 即Java 1.2版本开始,Sun开始在JDK中提供一套新的图形界面接口系统-Swing。全部Java爱好者都投入了对Swing的研究和迷恋。随着一大批使用Swing做为界面技术的IDE和程序出现,很快你们都意识到Swing的问题所在。

一些人认为Swing是轻量级的GUI系统,不管官方如何说,没有一个Java程序员会认为Swing是轻量级的,相反,Swing是一个很是巨大的GUI库,这一点已是Java界的共识。

Swing的一些底层类是借用了AWT的Component、Container、Window等少数几个基础类。估计的缘由是为了保持与AWT的兼容,方便你们将代码移植到Swing上。

下面是Swing的类关系图:

48e1530001ab412bb6b5557d.html

菊黄色类为Swing包的类。对比一下Swing的图与AWT的图,咱们能够发现,Swing图中,awt体系中的深灰色Windows控件类已经被去掉了。由于Swing再也不沿用Peer对等模式来实现GUI界面。

这是Swing的核心思想之一,Swing是彻底基于Java自绘制图形而实现的,于是Swing的界面看起来与Windows再也不有任何相似,尤为是窗口控件的样式(虽然咱们也能够经过换肤来达到模拟Windows界面的效果)。

因此上图清楚的代表了Swing是一个高层的GUI系统,而不像AWT那样与运行平台技术更加靠近的系统。咱们仍然用Button与Panel来作了一个例子,图中关系看出,Swing的类继承关系比AWT要复杂的多,并且Swing类大多都通过了中间的转接类-JComponent。而咱们经常使用的JFrame则另辟蹊径,从awt的window继承了下来。

这种结构关系决定了Swing的庞大与复杂性。不少初学者都难以理解Swing的模式和结构。

Swing 中的控件都是利用Java图形功能绘制出来的,而不是对应到平台的一个具体控件实现。咱们所用的全部Swing控件都是直接或者间接用Graphics绘制出来的,这种实现方式最大的好处是很灵活,咱们想要什么样的控件,就直接用Graphics绘制出来就是了。

Sun之因此用这种方式来实现,是为了在不牺牲移植性的基础上加入丰富的界面交互功能。

可是缺点也很明显:Swing的速度和效率是全部GUI系统中最慢的。

JBuilder和NetBeans的IDE都是纯正的Swing界面,启动一下,而后操做一下,好比拖动窗口之类的试试,你就会明白我在说什么。

之因此致使这个结果,其缘由是:

一、Swing的类层次太深,一个JFrame通过了4层的类继承关系,若是再加上虚拟机的图形功能内部实现,就有6层的转接关系,每一次的继承和转接都会消耗系统资源和速度损失。(过多的继承会下降系统的速度,由于操做子类每每是使用基类指向来完成通用操做的)

二、Swing是基于自绘制图形技术的,而Java为了保持可移植性,因此没法使用硬件加速和平台特性来加快图形操做的速度。于是Java的图形技术都是“高层”的图形技术,就好像咱们用Windows GDI去作动画同样,固然速度会很慢。

3、新的曙光-SWT

应该说,稍有阅历的Java的程序员都知道不少人对Swing效率低下的抱怨。IBM赞助的Eclipse开放源码项目,搞了一个另类的GUI系统-SWT。

SWT是一个很是独特的技术,其核心思想和Windows上的DirectX一模一样,也许SWT的程序员真的是借鉴了DirectX成功的秘诀。

下面是SWT技术原理的类关系图:java

67bf69ffaf4f05ed5f9dcf3505b31d31.png

咱们会看见,SWT的类关系很是直接并且易懂,有点像Delphi的API接口思想(此是我随便乱弹,与Delphi没有什么关系)。最重要的一点就是SWT的核心思想:SWT的功能实现是彻底构筑在以JNI为基础的,对运行平台的直接调用封装上的。

咱们能够从图中看见,SWT的功能没有经过任何Java虚拟机来操做,而是直接调用Windows GDI和Shell功能,这一点是经过JNI方法调用完成。

必定会有人说SWT破坏了java的移植思想,不过Eclipse的大范围流行,正好证实了SWT非但没有阻碍移植性,反而提升了各类操做系统对于Java GUI的利用和期待。这不能不说Eclipse项目组是充满智慧的。

在Eclipse下,plugin目录的swt目录下,你能够发现一个dll动态库文件,这个dll就是JNI方法调用库。

基于SWT技术实现的Eclipse界面不但速度很快,效率很高,并且比Swing要美观的多。这就是直接调用封装的效果。

咱们看看SWT的源代码就能更加明白为何SWT那么流行,为何SWT的速度像飞同样快,下面是从button类中抽取的一小段代码:

程序员

代码:

int callWindowProc (int msg, int wParam, int lParam) {

if (handle == 0) return 0;

return OS.CallWindowProc (ButtonProc, handle, msg, wParam, lParam);

}

int windowProc () {

return ButtonProc;

}

LRESULT wmDrawChild (int wParam, int lParam) {

if ((style & SWT.ARROW) == 0) return super.wmDrawChild (wParam, lParam);

DRAWITEMSTRUCT struct = new DRAWITEMSTRUCT ();

OS.MoveMemory (struct, lParam, DRAWITEMSTRUCT.sizeof);

int uState = OS.DFCS_SCROLLLEFT;

switch (style & (SWT.UP | SWT.DOWN | SWT.LEFT | SWT.RIGHT)) {

case SWT.UP: uState = OS.DFCS_SCROLLUP; break;

case SWT.DOWN: uState = OS.DFCS_SCROLLDOWN; break;

case SWT.LEFT: uState = OS.DFCS_SCROLLLEFT; break;

case SWT.RIGHT: uState = OS.DFCS_SCROLLRIGHT; break;

}

if (!getEnabled ()) uState |= OS.DFCS_INACTIVE;

if ((style & SWT.FLAT) == SWT.FLAT) uState |= OS.DFCS_FLAT;

if ((struct.itemState & OS.ODS_SELECTED) != 0) uState |= OS.DFCS_PUSHED;

RECT rect = new RECT ();

OS.SetRect (rect, struct.left, struct.top, struct.right, struct.bottom);

OS.DrawFrameControl (struct.hDC, rect, OS.DFC_SCROLL, uState);

return null;

}

我想任何一个有点Windows编程知识的人都会惊讶SWT的方式和作法,LRESULT、WindowProc都是作什么的,我想不用我多说了。我第一次看见SWT的代码时,惊讶的张大了嘴,我实在没法想象SWT项目组勇于将Java技术与Windows平台结合到如此紧密(固然,Linux平台版本也一样的结合紧密)。我竟然在SWT里发现了一个叫Tray的类,猜猜看它是干什么的?Tray可让你在java程序中显示一个任务栏图标,极度晕眩!

我想,不用再继续介绍SWT了,你必定也很兴奋,从SWT开始,JavaGUI并不必定意味着缓慢、低效率、弱小的功能,Windows程序的眩目与速度,Java程序也能够拥有,这就是SWT的价值。

更加剧要的是,SWT打破了长久以来人们对于移植性的误区,彷佛移植性就只能使用少到可怜的功能,咱们也能够用JNI来拥抱Java的世界,我想,未来不只仅是界面会借助JNI的方式,也许咱们的不少Java思想都会悄悄的发生改变,也许有一天咱们的Java代码能够运行的像VB同样快,这种思想意识的变革就是SWT的价值。编程

至于Swing的结局,我不知道,可是我知道我更加喜欢轻量级的并且快速的SWT,给你的程序多一个选择吧。设计模式

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值