1. 為什么要使用SWT?
SWT是一個IBM開發(fā)的跨平臺GUI開發(fā)工具包。至于為什么IBM要費(fèi)勁自己另起爐灶開發(fā)一個GUI工具包,而不是使用Sun現(xiàn)有的由AWT, Swing, Java 2D, Java 3D等構(gòu)成的Java GUI框架,那就說來話長了。(記得在一個BBS上讀過一個關(guān)于SWT起源的調(diào)侃類的帖子)。
在SWT之前,Sun已經(jīng)提供了一個跨平臺GUI開發(fā)工具包AWT (Abstract Windowing Toolkit)。雖然AWT框架也使用的是原生窗口部件(native widgets),但是它一直未能突破LCD問題。LCD問題導(dǎo)致了一些主要平臺特征的遺失。如果你不明白的話(其實(shí)我也沒明白),換句話說,如果平臺A有窗口部件(widgets)1–40,而平臺B有窗口部件(widgets)20–25,那么跨平臺的AWT框架只能提供這兩個窗口部件集的交集。
為解決這個問題,Sun又創(chuàng)建了一個新的框架。這個框架不再使用原生窗口部件,而是使用仿真窗口部件(emulated widgets)。這個方法雖然解決了LCD問題,并且提供了豐富的窗口部件集,但是它也帶來了新的問題。例如,Swing應(yīng)用程序的界面外觀不再和原生應(yīng)用程序的外觀相似。 雖然在JVM中這些Swing應(yīng)用程序已經(jīng)得到了程度的性能改善,但是它們還是存在著其原生對應(yīng)物所不具有的性能問題。并且,Swing應(yīng)用程序消耗太多的內(nèi)存,這樣Swing不適于一些小設(shè)備,如PDA和移動電話等。
IBM進(jìn)行了嘗試以徹底解決AWT和Swing框架帶來的上述問題。最終,IBM創(chuàng)建了一個新的GUI庫,這就是SWT。SWT框架通過JNI來訪問原生窗口部件。如果在宿主(host)平臺上無法找到一個窗口部件,SWT就會自動地模擬它。
2. SWT應(yīng)用程序的組成
一個SWT應(yīng)用程序的基本組成部分為顯示界面(Display)、命令界面(Shell,使命令進(jìn)入并使運(yùn)行初始化)和窗口部件(Widgets)。Display負(fù)責(zé)管理事件循環(huán)和控制UI線程和其他線程之間的通訊。Shell是應(yīng)用程序中被操作系統(tǒng)窗口管理器管理的窗口。每個SWT應(yīng)用程序至少需要一個Display和大于等于1個的Shell實(shí)例。
從不同的角度展示了SWT應(yīng)用程序。展示了UI對象的容器結(jié)構(gòu)(containment structure)。
如果一個應(yīng)用程序使用了多個線程,那么每個線程都使用的是Display對象分配給它自己的實(shí)例。程序員可以使用靜態(tài)方法Display.getCurent()來得到Display對象的當(dāng)前活動的實(shí)例。
Shell用于在特定的操作系統(tǒng)中表現(xiàn)窗口。Shell可以化、最小化或正?;?。Shell有兩種類型。第1種是高層shell,它是Display的子窗口,同時它也是一個主窗口。第2類是對話shell,這種shell要依賴于其他的shell窗口存在。shell窗口最終成為上述那種類型,要看在創(chuàng)建shell時傳遞給shell構(gòu)造函數(shù)的是什么風(fēng)格位(style bits)。一個shell的默認(rèn)值是DialogShell。也就是說,如果不帶參數(shù),那默認(rèn)就是一個對話shell。而如果給參數(shù)賦予了一個Display對象,則該shell將是一個高層shell。
一些窗口部件的屬性必須在創(chuàng)建它們的初期就要被設(shè)置。這些窗口部件的屬性就是前面所說的風(fēng)格位(style bits)。在SWT的類中,風(fēng)格位被定義為常數(shù)。例如,Button button = new Button( shell, )??梢允褂没颍∣R)操作符“|”來設(shè)置多個風(fēng)格位。例如,如果想設(shè)置一個帶邊界的壓下按鈕,需要傳遞SWT.PUSH | SWT.BORDER作為風(fēng)格位參數(shù)。
SWT是一個IBM開發(fā)的跨平臺GUI開發(fā)工具包。至于為什么IBM要費(fèi)勁自己另起爐灶開發(fā)一個GUI工具包,而不是使用Sun現(xiàn)有的由AWT, Swing, Java 2D, Java 3D等構(gòu)成的Java GUI框架,那就說來話長了。(記得在一個BBS上讀過一個關(guān)于SWT起源的調(diào)侃類的帖子)。
在SWT之前,Sun已經(jīng)提供了一個跨平臺GUI開發(fā)工具包AWT (Abstract Windowing Toolkit)。雖然AWT框架也使用的是原生窗口部件(native widgets),但是它一直未能突破LCD問題。LCD問題導(dǎo)致了一些主要平臺特征的遺失。如果你不明白的話(其實(shí)我也沒明白),換句話說,如果平臺A有窗口部件(widgets)1–40,而平臺B有窗口部件(widgets)20–25,那么跨平臺的AWT框架只能提供這兩個窗口部件集的交集。
為解決這個問題,Sun又創(chuàng)建了一個新的框架。這個框架不再使用原生窗口部件,而是使用仿真窗口部件(emulated widgets)。這個方法雖然解決了LCD問題,并且提供了豐富的窗口部件集,但是它也帶來了新的問題。例如,Swing應(yīng)用程序的界面外觀不再和原生應(yīng)用程序的外觀相似。 雖然在JVM中這些Swing應(yīng)用程序已經(jīng)得到了程度的性能改善,但是它們還是存在著其原生對應(yīng)物所不具有的性能問題。并且,Swing應(yīng)用程序消耗太多的內(nèi)存,這樣Swing不適于一些小設(shè)備,如PDA和移動電話等。
IBM進(jìn)行了嘗試以徹底解決AWT和Swing框架帶來的上述問題。最終,IBM創(chuàng)建了一個新的GUI庫,這就是SWT。SWT框架通過JNI來訪問原生窗口部件。如果在宿主(host)平臺上無法找到一個窗口部件,SWT就會自動地模擬它。
2. SWT應(yīng)用程序的組成
一個SWT應(yīng)用程序的基本組成部分為顯示界面(Display)、命令界面(Shell,使命令進(jìn)入并使運(yùn)行初始化)和窗口部件(Widgets)。Display負(fù)責(zé)管理事件循環(huán)和控制UI線程和其他線程之間的通訊。Shell是應(yīng)用程序中被操作系統(tǒng)窗口管理器管理的窗口。每個SWT應(yīng)用程序至少需要一個Display和大于等于1個的Shell實(shí)例。
從不同的角度展示了SWT應(yīng)用程序。展示了UI對象的容器結(jié)構(gòu)(containment structure)。
如果一個應(yīng)用程序使用了多個線程,那么每個線程都使用的是Display對象分配給它自己的實(shí)例。程序員可以使用靜態(tài)方法Display.getCurent()來得到Display對象的當(dāng)前活動的實(shí)例。
Shell用于在特定的操作系統(tǒng)中表現(xiàn)窗口。Shell可以化、最小化或正?;?。Shell有兩種類型。第1種是高層shell,它是Display的子窗口,同時它也是一個主窗口。第2類是對話shell,這種shell要依賴于其他的shell窗口存在。shell窗口最終成為上述那種類型,要看在創(chuàng)建shell時傳遞給shell構(gòu)造函數(shù)的是什么風(fēng)格位(style bits)。一個shell的默認(rèn)值是DialogShell。也就是說,如果不帶參數(shù),那默認(rèn)就是一個對話shell。而如果給參數(shù)賦予了一個Display對象,則該shell將是一個高層shell。
一些窗口部件的屬性必須在創(chuàng)建它們的初期就要被設(shè)置。這些窗口部件的屬性就是前面所說的風(fēng)格位(style bits)。在SWT的類中,風(fēng)格位被定義為常數(shù)。例如,Button button = new Button( shell,

