AWT和Swing的可訪問性
可訪問性
創(chuàng)建一個(gè)殘疾人可以訪問的 GUI 是非常重要的。Swing 為實(shí)現(xiàn)具有可訪問性的 GUI 提供了豐富的基礎(chǔ)設(shè)施和 API。這種支持是單獨(dú)的,但是如果主機(jī)上具有可訪問性支持,那么它們應(yīng)該集成在一起。
與 AWT 一樣,Swing 可以支持 GUI 組件的自動(dòng)銷毀。Swing 還可以支持 AWT 的自底向上和自頂向下的構(gòu)建方法。
與 AWT 不同,Swing 組件不是線程安全的,這意味著您需要關(guān)心在應(yīng)用程序中是哪個(gè)線程在更新 GUI。如果在使用線程時(shí)出現(xiàn)了錯(cuò)誤,就可能會(huì)出現(xiàn)不可預(yù)測(cè)的行為,包括用戶界面故障。有一些工具可以幫助管理線程的問題。
與 AWT 類似,Swing 的一個(gè)優(yōu)點(diǎn)是,它也是 Java 技術(shù)的一種標(biāo)準(zhǔn)配置。這意味著您不需要自己來安裝它了。不幸的是,Swing 已經(jīng)有了很大的變化,因此它很容易變得依賴于最新版本的 Java 語言所提供的特性,這可能會(huì)強(qiáng)制用戶更新自己的 Java 運(yùn)行時(shí)環(huán)境。
與 AWT 的概念相比,SWT 是一個(gè)低級(jí)的 GUI 工具包。JFace 是一組用來簡(jiǎn)化使用 SWT 構(gòu)建 GUI 的增強(qiáng)組件和工具服務(wù)。SWT 的構(gòu)建者從 AWT和Swing 實(shí)現(xiàn)中學(xué)習(xí)了很多經(jīng)驗(yàn),他們?cè)噲D構(gòu)建一個(gè)集二者優(yōu)點(diǎn)于一體而沒有二者的缺點(diǎn)的系統(tǒng)。從很多方面來說,他們已經(jīng)成功了。
SWT 也是基于一個(gè)對(duì)等體實(shí)現(xiàn)的,在這一點(diǎn)上它與 AWT 非常類似。它克服了 AWT 所面臨的 LCD 的問題,方法如下:定義了一組控件,它們可以用來構(gòu)建大部分辦公應(yīng)用程序或開發(fā)者工具,然后可以按照逐個(gè)主機(jī)的原則,為特定主機(jī)所沒有提供的控件創(chuàng)建模擬控件(這與 Swing 類似)。對(duì)于大部分現(xiàn)代主機(jī)來說,幾乎所有的控件都是基于本地對(duì)等體的。這意味著基于 SWT 的 GUI 既具有主機(jī)外觀,又具有主機(jī)的性能。這樣就避免了使用 AWT和Swing 而引起的大部分問題。特定的主機(jī)具有一些低級(jí)功能控件,因此 SWT 提供了擴(kuò)充(通常是模擬的)版本(通常使用 “C” 作為名字中的第一個(gè)字母),從而可以產(chǎn)生更一致的行為。
在對(duì)等體工作方式上,SWT 與 AWT 不同。在 SWT 中,對(duì)等體只是主機(jī)控件上的一些封裝程序而已。在 AWT 中,對(duì)等體可以提供服務(wù)來最小化主機(jī)之間的差異(就是在這里,AWT 碰到了很多行為不一致的問題)。這意味著 SWT 應(yīng)用程序?qū)嶋H上就是一個(gè)主機(jī)應(yīng)用程序,它必然會(huì)全部繼承主機(jī)的優(yōu)點(diǎn)和缺點(diǎn)。這還意味著 SWT 不能完全實(shí)現(xiàn) WORE 的目標(biāo);它更像是一種 WOTE 解決方案。這就是說,SWT 盡管不如 Swing 那么優(yōu)秀,但是它在創(chuàng)建可移植解決方案方面是很杰出的。
正如您可以看到的一樣,這些組件集比 AWT 提供的組件集更為廣泛,與 Swing 組件集相比也毫不遜色。
與 AWT和Swing 布局管理器類似,SWT 也提供了非常豐富的布局部件集。布局系統(tǒng)與嵌套容器一起使用,可以生成所需要的任何布局算法。所有這 3 個(gè) GUI 庫也可以支持對(duì)部件的定位實(shí)現(xiàn)絕對(duì)控制。SWT 沒有等效的 BorderLayout 部件,這一點(diǎn)非常令人失望。FormLayout 對(duì)于創(chuàng)建表單基本輸入來說非常好用。我認(rèn)為 SWT 的布局機(jī)制比 AWT/Swing 布局部件集的使用更難學(xué)習(xí)。
與 AWT和Swing 事件系統(tǒng)一樣,SWT 提供了非常豐富的事件集。盡管這些事件并不能與 AWT/Swing 的事件一一對(duì)應(yīng)(例如 AWT和Swing 的按鈕都會(huì)產(chǎn)生 ActionEvent 事件,而 SWT 的按鈕產(chǎn)生的則是 SelectionEvent 事件),但是它們通常都是等價(jià)的。
很多 Swing 組件,例如 JTable,都有自己的模型。對(duì)應(yīng)的 SWT 控件(例如 Table)則沒有;不過它們有自己的條目。條目通常用來限制顯示文本或通常很小的圖像(例如圖標(biāo))。為了提供一種類 Swing 的模型接口,SWT 使用了 JFace ContentProviders。這些組件可以在應(yīng)用程序提供的模型(例如 List 或 Table 使用的 java.util.Array )和用作視圖的控件之間充當(dāng)一個(gè)橋梁。為了將任意模型對(duì)象格式化成條目,SWT 使用了 JFace LabelProviders,它們可以為任何模型對(duì)象生成一個(gè)文本或圖標(biāo)格式。這可以對(duì)復(fù)雜模型對(duì)象的混合顯示進(jìn)行限制。其他類似組件,例如 ColorProviders 和 LabelDecorators,可以增強(qiáng)對(duì)這些條目的顯示。對(duì)于 Tables 的特例來說,SWT 提供了 CellEditor,它可以臨時(shí)將任意 SWT 控件鏈接到一個(gè) Table 單元格上,從而當(dāng)作這個(gè)單元格的編輯器使用。
SWT 不支持 GUI 控件的自動(dòng)銷毀。這意味著我們必須顯式地銷毀所創(chuàng)建的任何控件和資源,例如顏色和字體,而不能利用 API 調(diào)用來實(shí)現(xiàn)這種功能。這種工作從某種程度上來說得到了簡(jiǎn)化,因?yàn)槿萜骺刂屏似渥涌丶淖詣?dòng)銷毀功能。
使用 SWT 只能自頂向下地構(gòu)建 GUI。因此,如果沒有父容器,子控件也就不存在了;通常父容器都不能在以后任意改變。這種方法不如 AWT/Swing 靈活??丶窃趧?chuàng)建時(shí)被添加到父容器中的,在銷毀時(shí)被從父容器中刪除的。而且 SWT 對(duì)于 style 位的使用只會(huì)在構(gòu)建時(shí)進(jìn)行,這限制了有些 GUI 控件的靈活性。有些風(fēng)格只是一些提示性的,它們?cè)谒衅脚_(tái)上的行為可能并不完全相同。
與 Swing 類似,SWT 組件也不是線程安全的,這意味著您必須要關(guān)心在應(yīng)用程序中是哪個(gè)線程對(duì) GUI 進(jìn)行了更新。如果在使用線程時(shí)發(fā)生了錯(cuò)誤,就會(huì)拋出異常。我認(rèn)為這比不確定的 Swing 方法要好。有一些工具可以幫助管理線程的問題。
如果所支持的操作系統(tǒng)提供了可訪問性服務(wù),那么 SWT GUI 通常也就具有很好的可訪問性。當(dāng)默認(rèn)信息不夠時(shí),SWT 為程序員提供了一個(gè)基本的 API 來指定可訪問性信息。
SWT 提供了一個(gè)有限的圖形環(huán)境。到目前為止,它對(duì)于 Java2D 和 Java3D 的支持還不怎么好。Eclipse 使用一個(gè)名為 Draw2D 的組件提供了另外一種單獨(dú)的圖形編輯框架(Graphical Editing Framework,GEF),它可以用來創(chuàng)建一些繪圖應(yīng)用程序,例如 UML 建模工具。不幸的是,GEF 難以單獨(dú)(即在整個(gè) Eclipse 環(huán)境之外)使用。
與 AWT和Swing 不同,SWT 和 JFace 并不是 Java 技術(shù)的標(biāo)準(zhǔn)配置。它們必須單獨(dú)進(jìn)行安裝,這可以當(dāng)作是 Eclipse 安裝的一部分,也可以當(dāng)作是單獨(dú)的庫進(jìn)行安裝。Eclipse 小組已經(jīng)使它的安裝變得非常簡(jiǎn)單,并且 SWT 可以與 Eclipse 分開單獨(dú)運(yùn)行。所需要的 Java 檔案文件(JAR)和動(dòng)態(tài)鏈接庫(DLL)以及 UNIX® 和 Macintosh 上使用的類似庫可以從 Eclipse Web 站點(diǎn)上單獨(dú)下載。JFace 庫需要您下載所有的 Eclipse 文件,并拷貝所需要的 JAR 文件。在下載所需要的文件之后,我們還需要將這些 JAR 文件放到 Java CLASSPATH 中,并將 DLL 文件放到系統(tǒng) PATH 中。
【編輯推薦】