當前位置:才華齋>計算機>java語言>

Java GUI:SWT/Swing/AWT的介紹及比較

java語言 閱讀(2.42W)

Java GUI:SWT/Swing/AWT的介紹及比較由本站小編收集整理,通過本文了解對每個工具包的基本特性的介紹,以及使用每個工具包的優缺點。歡迎閱讀!更多內容請關注應屆畢業生考試網!

Java GUI:SWT/Swing/AWT的介紹及比較

  簡介

developerWorks 上另外一些作者已經展示瞭如何在 Swing 和 SWT 之間很好地進行遷移(參見 參考資料)。本文的目標是幫助您在開始開發專案之前確定選擇使用哪個 GUI 工具包。

但是首先我們要弄清一個問題:為什麼會有多個 Java? GUI 工具包呢?最好的答案是,一個工具包並不能滿足所有的要求,最近也不會開發一個可以滿足所有要求的 GUI 工具包。每個工具包都有各自的優缺點,這樣就可以根據自己的需求和目標使用者來選擇適當的工具包。

下面就讓我們來學習有關這些工具包的知識。

  AWT 概述

Abstract Windows Toolkit(AWT)是最原始的 Java GUI 工具包。AWT 的主要優點是,它在 Java 技術的每個版本上都成為了一種標準配置,包括早期的 Web 瀏覽器中的 Java 實現;另外它也非常穩定。這意味著我們不需要單獨安裝這個工具包,在任何一個 Java 執行環境中都可以使用它,這一點正是我們所希望的特性。

AWT 是一個非常簡單的具有有限 GUI 元件、佈局管理器和事件的工具包(參見 清單 1、清單 2 和 清單 3)。這是因為 Sun 公司決定為 AWT 使用一種最小公分母(LCD)的方法。因此它只會使用為所有 Java 主機環境定義的 GUI 元件。最終的結果非常不幸,有些經常使用的元件,例如表、樹、進度條等,都不支援。對於需要更多元件型別的應用程式來說,我們需要從頭開始建立這些元件。這是一個很大的負擔。

清單 1. 基本的 AWT Class 樹(全部在 包中, “*” 表示抽象)

Object CheckboxGroup *Component Button Canvas CheckBox Choice Container Panel Applet ScrollPane Window Dialog Frame Label List TextComponent TextArea TextField MenuComponent MenuItem CheckboxMenuItem Menu PopupMenu

注意:另外幾個包中還有其他一些 AWT 元件,但是這是基本的元件集。

清單 2. AWT 提供了下面的佈局管理器(全部在 包中,“*” 表示介面)

*LayoutManager FlowLayout GridLayout *LayoutManager2 BorderLayout CardLayout GridBagLayout

注意:另外幾個包中還有一些 AWT 佈局管理器,很多都是為它們進行佈局的容器專門定製的,但是這是基本的佈局管理器集。

清單 3. AWT 提供了以下事件(大部分在 ts 包中)

Object EventObject AWTEvent ActionEvent AdjustmentEvent ComponentEvent ContainerEvent FocusEvent InputEvent KeyEvent MouseEvent MouseWheelEvent PaintEvent WindowEvent HierarchyEvent InputMethodEvent InvocationEvent ItemEvent TextEvent

注意:其他幾個包中還有另外一些 AWT 事件,但是這是基本的事件集。這些是從更通用的事件生成的具體事件。

通常對於 AWT 來說(也適用於 Swing 和 SWT),每個事件型別都有一個相關的 XxxListener 介面(XxxAdapter 的實現可能為空),其中 Xxx 是去掉 Event 字尾的事件名(例如,KeyEvent 事件的介面是 KeyListener),用來把事件傳遞給處理程式。應用程式會為自己感興趣處理的`事件的事件源(GUI 元件或部件)進行註冊。有時監聽介面要處理多個事件。

AWT 的一個很好的特性是它通常可以對 GUI 元件自動進行銷燬。這意味著您幾乎不需要對元件進行銷燬。一個例外是高階元件,例如對話方塊和框架。如果您建立了耗費大量主機資源的資源,就需要手動對其進行銷燬。

AWT 元件是 “執行緒安全的(thread-safe)”,這意味著我們不需要關心在應用程式中是哪一個執行緒對 GUI 進行了更新。這個特性可以減少很多 GUI 更新的問題,不過使 AWT GUI 執行的速度更慢了。

AWT 讓我們可以以自頂向下(top-down) 或自底向上(bottom-up) 或以任意組合順序來構建 GUI。自頂向下的意思是在建立子元件之前首先建立容器元件;自底向上的意思是在建立容器(或父)元件之前建立子元件。在後一種情況中,元件的存在並不依賴於父容器,其父容器可以隨時改變。

通常來說,AWT GUI 都是不可訪問的。系統並沒有為 AWT 程式設計師提供 API 來指定可訪問性資訊。可訪問性(accessibility)處理的是殘疾人可以怎樣使用應用程式的問題。一個應用程式要想有很好的可訪問性,必須與執行平臺一起,讓殘疾人可以通過使用適當的輔助技術(提供其他使用者介面的工具)來使用這些應用程式。很多政府和企業都有一些強制要求應用程式為實現可訪問性而採用的標準。

Sun 希望 Java 語言能夠成為一種 “編寫一次就可以隨處執行(write once, run everywhere,即 WORE)” 的環境。這意味著可以在一臺機器上開發和測試 Java 程式碼(例如在 Windows? 上),然後不經測試就可以在另外一個 Java 主機上運行同樣的 Java 程式碼。對於大部分情況來說,Java 技術都可以成功實現這種功能,但是 AWT 卻是一個弱點。由於 AWT 要依賴於主機 GUI 的對等體(peer)控制元件(其中每個 AWT 元件都有一個並行的主機控制元件或者對等體)來實現這個 GUI,這個 GUI 的外觀和行為(這一點更重要)在不同的主機上會有所不同。這會導致出現 “編寫一次隨處測試(write once, test everywhere,即 WOTE)” 的情況,這樣就遠遠不能滿足我們的要求了。

AWT 提供了一個豐富的圖形環境,尤其是在 Java V1.2 及其以後版本中更是如此。通過 Graphics2D 物件和 Java2D、Java3D 服務,我們可以建立很多功能強大的圖形應用程式,例如畫圖和製表包;結合使用 JavaSound,我們還可以建立非常有競爭力的互動式遊戲。

  Swing 概述

Java Swing 是 Java Foundation Classes(JFC)的一部分,它是試圖解決 AWT 缺點的一個嘗試。在 Swing 中,Sun 開發了一個經過仔細設計的、靈活而強大的 GUI 工具包。不幸的是,這意味著我們又要花一些時間來學習 Swing 了,對於常見的情況來說,Swing 有些太複雜了。

Swing 是在 AWT 元件基礎上構建的。所有 Swing 元件實際上也是 AWT 的一部分。Swing 使用了 AWT 的事件模型和支援類,例如 Colors、Images 和 Graphics。Swing 元件、佈局管理器以及事件總結如下(參見 清單 4、清單 5 和 清單 6)。正如您可以看到的一樣,這些元件集比 AWT 提供的元件集更為廣泛,與 SWT 元件集相比也毫不遜色。

清單 4. 基本的 Swing Class 樹(全部在 g 包或其子包中,“*” 表示抽象類)

Object *Component Container *JComponent *AbstractButton JButton JMenuItem JCheckBonMenuItem JMenu JRadioButonMenuItem *JToggleButton JCheckBox JRadioButton Box Filler JColorChooser JComboBox JDesktopIcon JFileChooser JInternalFrame JLabel JLayeredPane JDesktopPane JList JMenuBar JOptionPane JPanel JPopupMenu JProgressBar JRootPane JScrollBar JScrollPane JSeparator JSlider JSplitPane JTabbedPane JTable JTableHeader *JTextComponent JEditorPane FrameEditorPane JTextPane JTextArea JtextField JPasswordField JToolBar JToolTip JTree JViewport ScrollableTabViewport Panel Applet JApplet Window Dialog JDialog Frame JFrame JWindow

注意:在另外幾個包中還有其他一些 Swing 元件,但是這是基本的元件集。

清單 5. Swing 提供了以下 LayoutManagers(全部在 g 包或其子包中,“*” 表示介面)

*LayoutManager CenterLayout *LayoutManager2 BoxLayout OverlayLayout SpringLayout

注意:在另外幾個包中還有其他一些 Swing 佈局管理器,很多都是為它們所佈局的容器而專門定製的,但是這是基本的佈局管理器集。

清單 6. Swing 提供了以下事件(大部分在 ts 包及其子包中)

Object EventObject AWTEvent AncestorEvent ComponentEvent InputEvent KeyEvent MenuKeyEvent MouseEvent MenuDragMouseEvent InternalFrameEvent

注意:在另外幾個包中還有其他一些 AWT 事件,但是這是基本的事件集。這些是從更通用的事件生成的 “高階” 事件。

為了克服在不同主機上行為也會不同的缺點,Swing 將對主機控制元件的依賴性降至了最低。實際上,Swing 只為諸如視窗和框架之類的頂層 元件使用對等體。大部分元件(JComponent 及其子類)都是使用純 Java 程式碼來模擬的。這意味著 Swing 天生就可以在所有主機之間很好地進行移植。因此,Swing 通常看起來並不像是本地程式。實際上,它有很多外觀,有些模擬(儘管通常並不精確)不同主機的外觀,有些則提供了獨特的外觀。

Swing 對基於對等體的元件使用的術語是重量級(heavyweight),對於模擬的元件使用的術語是輕量級(lightweight)。實際上,Swing 可以支援在一個 GUI 中混合使用重量級元件和輕量級元件,例如在一個 JContainer 中混合使用 AWT 和 Swing 控制元件,但是如果元件產生了重疊,就必須注意繪製這些控制元件的順序。

Swing 無法充分利用硬體 GUI 加速器和專用主機 GUI 操作的優點。結果是 Swing 應用程式可能比本地 GUI 的程式執行速度都慢。Sun 花費了大量的精力來改進最近版本的 Swing (Java V1.4 和 1.5)的效能,這種缺點正在變得日益微弱。由於 Swing 的設計更加健壯,因此其程式碼基礎也更堅實。這意味著它可以在一臺健壯的機器上比 AWT 和 SWT 上執行得更好。

除了具有更多的元件、佈局管理器和事件之外,Swing 還有很多特性使得自己比 AWT 的功能更加強大。下面是更為重要的幾個特性:

  模型與檢視和控制元件分離

對於這個模型中的所有元件(例如按鈕、列表、表、樹、富文字)來說,模型都是與元件分離的。這樣可以根據應用程式的需求來採用模型,並在多個檢視之間進行共享。為了方便起見,每個元件型別都提供有預設的模型。

  可程式設計外觀

每個元件的外觀(外表以及如何處理輸入事件)都是由一個單獨的、可動態替換的實現來進行控制的。這樣我們就可以改變基於 Swing 的 GUI 的部分或全部外觀。

  呈現器和編輯器

大部分顯示模型內容的元件,例如列表、表和樹,都可以處理幾乎所有型別的模型元素。這可以通過為每種元件型別和模型型別對映一個渲染器或編輯器來實現。例如,一個具有包含 值的列的表可以有一些專用的程式碼來呈現資料值和編輯資料值。每一列都可以有不同的型別。

  可訪問性

建立一個殘疾人可以訪問的 GUI 是非常重要的。Swing 為實現具有可訪問性的 GUI 提供了豐富的基礎設施和 API。這種支援是單獨的,但是如果主機上具有可訪問性支援,那麼它們應該整合在一起。

與 AWT 一樣,Swing 可以支援 GUI 元件的自動銷燬。Swing 還可以支援 AWT 的自底向上和自頂向下的構建方法。

與 AWT 不同,Swing 元件不是執行緒安全的,這意味著您需要關心在應用程式中是哪個執行緒在更新 GUI。如果在使用執行緒時出現了錯誤,就可能會出現不可預測的行為,包括使用者介面故障。有一些工具可以幫助管理執行緒的問題。

與 AWT 類似,Swing 的一個優點是,它也是 Java 技術的一種標準配置。這意味著您不需要自己來安裝它了。不幸的是,Swing 已經有了很大的變化,因此它很容易變得依賴於最新版本的 Java 語言所提供的特性,這可能會強制使用者更新自己的 Java 執行時環境。