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

來源:文萃谷 2.34W

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 運行時環境。

熱門標籤