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