Java中AWT、Swing与SWT三大GUI技术的原理与效率差异 |
您所在的位置:网站首页 › python图形界面设计与面向设计的区别和联系 › Java中AWT、Swing与SWT三大GUI技术的原理与效率差异 |
看了一下对Java GUI讨论的帖子,所以写了一篇文章来阐述一下各种GUI技术的优劣。 Java世界中,目前最知名的三大GUI库分别是: 1、AWT(Abstract Window Toolkit)抽象窗口工具包库,包含于所有的Java SDK中 2、Swing高级图形库,包含于Java2 SDK中 3、来自IBM Eclipse开源项目的SWT(Standard Widget Toolkit)标准窗口部件库,不包含于JDK中,需要从Eclipse单独下载一、AWT的原理:小巧却简陋的GUI系统 AWT出现于Java 1.x中,是Java初期所内置的一种面向窗口应用的库。AWT使用的技术是对等设计模式(即Peer),其结构关系参见下图。
我们会看见,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,给你的程序多一个选择吧。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |