java swt 双屏_Java中AWT、Swing与SWT三大GUI技术的原理与效率差异
看了一下對(duì)Java GUI討論的帖子,所以寫(xiě)了一篇文章來(lái)闡述一下各種GUI技術(shù)的優(yōu)劣。
Java世界中,目前最知名的三大GUI庫(kù)分別是:
1、AWT(Abstract Window Toolkit)抽象窗口工具包庫(kù),包含于所有的Java SDK中
2、Swing高級(jí)圖形庫(kù),包含于Java2 SDK中
3、來(lái)自IBM Eclipse開(kāi)源項(xiàng)目的SWT(Standard Widget Toolkit)標(biāo)準(zhǔn)窗口部件庫(kù),不包含于JDK中,需要從Eclipse單獨(dú)下載
一、AWT的原理:小巧卻簡(jiǎn)陋的GUI系統(tǒng)
AWT出現(xiàn)于Java 1.x中,是Java初期所內(nèi)置的一種面向窗口應(yīng)用的庫(kù)。AWT使用的技術(shù)是對(duì)等設(shè)計(jì)模式(即Peer),其結(jié)構(gòu)關(guān)系參見(jiàn)下圖。
從這幅類(lèi)關(guān)系圖很容易看出AWT的技術(shù)實(shí)現(xiàn)和Peer設(shè)計(jì)模式。圖中,黃色的類(lèi)是java.awt包中的類(lèi),淺灰色部分是Java虛擬機(jī)部分,而深灰色則是Windows平臺(tái)。
awt的重點(diǎn)是對(duì)等Peer設(shè)計(jì)模式。所謂Peer對(duì)等設(shè)計(jì)模式就是將awt控件直接對(duì)應(yīng)到運(yùn)行平臺(tái)上的一個(gè)類(lèi)似或者等同控件上。比如圖中的Button類(lèi)就是對(duì)應(yīng)了深灰色的Windows的標(biāo)準(zhǔn)Button功能。
對(duì)等模式用于在兩個(gè)控件間之間建立一個(gè)相互作用的聯(lián)系,而充當(dāng)紐帶的則是Java虛擬機(jī)和虛擬機(jī)-GDI的接口(以Windows為例子)。所以,我們可以看出,awt首先需要經(jīng)過(guò)通用的Java技術(shù)來(lái)控制圖形、事件等,然后Java虛擬機(jī)再將請(qǐng)求傳送到具體的平臺(tái)圖形和控件接口去交互。
對(duì)等模式的效率并不很高,因?yàn)锳WT通過(guò)了虛擬機(jī)和虛擬機(jī)-GDI這兩個(gè)層次來(lái)完成一個(gè)操作,經(jīng)過(guò)的層次系統(tǒng)越多,速度和效率就越慢。而且Peer對(duì)等模式有一個(gè)致命的弱點(diǎn):移植性非常差!
這就是Sun為什么要用Swing來(lái)誘惑我們離開(kāi)AWT的主要原因。因?yàn)榧热皇菍?duì)等模式,那么AWT就必須使用所有圖形操作系統(tǒng)的圖形接口功能的交集,因?yàn)?AWT的接口只有一套,所以,為了保證移植性,就只能使用所有系統(tǒng)都能夠支持的最少特性。因而我們經(jīng)常可以聽(tīng)見(jiàn)有人抱怨AWT的功能太少,圖形太難看等等,這是為了保證移植性而作出的犧牲。
二、猛犸巨獸的誕生-Swing
從Java2 即Java 1.2版本開(kāi)始,Sun開(kāi)始在JDK中提供一套新的圖形界面接口系統(tǒng)-Swing。所有Java愛(ài)好者都投入了對(duì)Swing的研究和迷戀。隨著一大批使用Swing作為界面技術(shù)的IDE和程序出現(xiàn),很快大家都意識(shí)到Swing的問(wèn)題所在。
一些人認(rèn)為Swing是輕量級(jí)的GUI系統(tǒng),無(wú)論官方如何說(shuō),沒(méi)有一個(gè)Java程序員會(huì)認(rèn)為Swing是輕量級(jí)的,相反,Swing是一個(gè)非常巨大的GUI庫(kù),這一點(diǎn)已經(jīng)是Java界的共識(shí)。
Swing的一些底層類(lèi)是借用了AWT的Component、Container、Window等少數(shù)幾個(gè)基礎(chǔ)類(lèi)。估計(jì)的原因是為了保持與AWT的兼容,方便大家將代碼移植到Swing上。
下面是Swing的類(lèi)關(guān)系圖:
菊黃色類(lèi)為Swing包的類(lèi)。對(duì)比一下Swing的圖與AWT的圖,我們可以發(fā)現(xiàn),Swing圖中,awt體系中的深灰色Windows控件類(lèi)已經(jīng)被去掉了。因?yàn)镾wing不再沿用Peer對(duì)等模式來(lái)實(shí)現(xiàn)GUI界面。
這是Swing的核心思想之一,Swing是完全基于Java自繪制圖形而實(shí)現(xiàn)的,因而Swing的界面看起來(lái)與Windows不再有任何類(lèi)似,尤其是窗口控件的樣式(雖然我們也可以通過(guò)換膚來(lái)達(dá)到模擬Windows界面的效果)。
所以上圖清楚的表明了Swing是一個(gè)高層的GUI系統(tǒng),而不像AWT那樣與運(yùn)行平臺(tái)技術(shù)更加靠近的系統(tǒng)。我們?nèi)匀挥肂utton與Panel來(lái)做了一個(gè)例子,圖中關(guān)系看出,Swing的類(lèi)繼承關(guān)系比AWT要復(fù)雜的多,而且Swing類(lèi)大多都經(jīng)過(guò)了中間的轉(zhuǎn)接類(lèi)-JComponent。而我們常用的JFrame則另辟蹊徑,從awt的window繼承了下來(lái)。
這種結(jié)構(gòu)關(guān)系決定了Swing的龐大與復(fù)雜性。很多初學(xué)者都難以理解Swing的模式和結(jié)構(gòu)。
Swing 中的控件都是利用Java圖形功能繪制出來(lái)的,而不是對(duì)應(yīng)到平臺(tái)的一個(gè)具體控件實(shí)現(xiàn)。我們所用的所有Swing控件都是直接或者間接用Graphics繪制出來(lái)的,這種實(shí)現(xiàn)方式最大的好處是很靈活,我們想要什么樣的控件,就直接用Graphics繪制出來(lái)就是了。
Sun之所以用這種方式來(lái)實(shí)現(xiàn),是為了在不犧牲移植性的基礎(chǔ)上加入豐富的界面交互功能。
但是缺點(diǎn)也很明顯:Swing的速度和效率是所有GUI系統(tǒng)中最慢的。
JBuilder和NetBeans的IDE都是純正的Swing界面,啟動(dòng)一下,然后操作一下,比如拖動(dòng)窗口之類(lèi)的試試,你就會(huì)明白我在說(shuō)什么。
之所以導(dǎo)致這個(gè)結(jié)果,其原因是:
1、Swing的類(lèi)層次太深,一個(gè)JFrame經(jīng)過(guò)了4層的類(lèi)繼承關(guān)系,如果再加上虛擬機(jī)的圖形功能內(nèi)部實(shí)現(xiàn),就有6層的轉(zhuǎn)接關(guān)系,每一次的繼承和轉(zhuǎn)接都會(huì)消耗系統(tǒng)資源和速度損失。(過(guò)多的繼承會(huì)降低系統(tǒng)的速度,因?yàn)椴僮髯宇?lèi)往往是使用基類(lèi)指向來(lái)完成通用操作的)
2、Swing是基于自繪制圖形技術(shù)的,而Java為了保持可移植性,所以無(wú)法使用硬件加速和平臺(tái)特性來(lái)加快圖形操作的速度。因而Java的圖形技術(shù)都是“高層”的圖形技術(shù),就好像我們用Windows GDI去做動(dòng)畫(huà)一樣,當(dāng)然速度會(huì)很慢。
三、新的曙光-SWT
應(yīng)該說(shuō),稍有閱歷的Java的程序員都知道很多人對(duì)Swing效率低下的抱怨。IBM贊助的Eclipse開(kāi)放源碼項(xiàng)目,搞了一個(gè)另類(lèi)的GUI系統(tǒng)-SWT。
SWT是一個(gè)非常獨(dú)特的技術(shù),其核心思想和Windows上的DirectX如出一轍,也許SWT的程序員真的是借鑒了DirectX成功的秘訣。
下面是SWT技術(shù)原理的類(lèi)關(guān)系圖:
我們會(huì)看見(jiàn),SWT的類(lèi)關(guān)系非常直接而且易懂,有點(diǎn)像Delphi的API接口思想(此是我隨便亂彈,與Delphi沒(méi)有什么關(guān)系)。最重要的一點(diǎn)就是SWT的核心思想:SWT的功能實(shí)現(xiàn)是完全構(gòu)筑在以JNI為基礎(chǔ)的,對(duì)運(yùn)行平臺(tái)的直接調(diào)用封裝上的。
我們可以從圖中看見(jiàn),SWT的功能沒(méi)有通過(guò)任何Java虛擬機(jī)來(lái)操作,而是直接調(diào)用Windows GDI和Shell功能,這一點(diǎn)是通過(guò)JNI方法調(diào)用完成。
一定會(huì)有人說(shuō)SWT破壞了java的移植思想,不過(guò)Eclipse的大范圍流行,正好證明了SWT非但沒(méi)有阻礙移植性,反而提高了各種操作系統(tǒng)對(duì)于Java GUI的利用和期待。這不能不說(shuō)Eclipse項(xiàng)目組是充滿(mǎn)智慧的。
在Eclipse下,plugin目錄的swt目錄下,你可以發(fā)現(xiàn)一個(gè)dll動(dòng)態(tài)庫(kù)文件,這個(gè)dll就是JNI方法調(diào)用庫(kù)。
基于SWT技術(shù)實(shí)現(xiàn)的Eclipse界面不但速度很快,效率很高,而且比Swing要美觀的多。這就是直接調(diào)用封裝的效果。
我們看看SWT的源代碼就能更加明白為什么SWT那么流行,為什么SWT的速度像飛一樣快,下面是從button類(lèi)中抽取的一小段代碼:
代碼:
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;
}
我想任何一個(gè)有點(diǎn)Windows編程知識(shí)的人都會(huì)驚訝SWT的方式和做法,LRESULT、WindowProc都是做什么的,我想不用我多說(shuō)了。我第一次看見(jiàn)SWT的代碼時(shí),驚訝的張大了嘴,我實(shí)在無(wú)法想象SWT項(xiàng)目組敢于將Java技術(shù)與Windows平臺(tái)結(jié)合到如此緊密(當(dāng)然,Linux平臺(tái)版本也同樣的結(jié)合緊密)。我居然在SWT里發(fā)現(xiàn)了一個(gè)叫Tray的類(lèi),猜猜看它是干什么的?Tray可以讓你在java程序中顯示一個(gè)任務(wù)欄圖標(biāo),極度暈眩!
我想,不用再繼續(xù)介紹SWT了,你一定也很興奮,從SWT開(kāi)始,JavaGUI并不一定意味著緩慢、低效率、弱小的功能,Windows程序的眩目與速度,Java程序也可以擁有,這就是SWT的價(jià)值。
更加重要的是,SWT打破了長(zhǎng)久以來(lái)人們對(duì)于移植性的誤區(qū),似乎移植性就只能使用少到可憐的功能,我們也可以用JNI來(lái)?yè)肀ava的世界,我想,將來(lái)不僅僅是界面會(huì)借助JNI的方式,也許我們的很多Java思想都會(huì)悄悄的發(fā)生改變,也許有一天我們的Java代碼可以運(yùn)行的像VB一樣快,這種思想意識(shí)的變革就是SWT的價(jià)值。
至于Swing的結(jié)局,我不知道,但是我知道我更加喜歡輕量級(jí)的而且快速的SWT,給你的程序多一個(gè)選擇吧。
總結(jié)
以上是生活随笔為你收集整理的java swt 双屏_Java中AWT、Swing与SWT三大GUI技术的原理与效率差异的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 支付签约_与支付巨头万事达卡签约,金融服
- 下一篇: 蜂鸣器接入_无源蜂鸣器的原理和和mixl