- 相關(guān)推薦
Java GUI:SWT/Swing/AWT的介紹及比較
Java GUI:SWT/Swing/AWT的介紹及比較由百分網(wǎng)小編收集整理,通過本文了解對每個工具包的基本特性的介紹,以及使用每個工具包的優(yōu)缺點。歡迎閱讀!更多內(nèi)容請關(guān)注應(yīng)屆畢業(yè)生考試網(wǎng)!
簡介
developerWorks 上另外一些作者已經(jīng)展示了如何在 Swing 和 SWT 之間很好地進(jìn)行遷移(參見 參考資料)。本文的目標(biāo)是幫助您在開始開發(fā)項目之前確定選擇使用哪個 GUI 工具包。
但是首先我們要弄清一個問題:為什么會有多個 Java? GUI 工具包呢?最好的答案是,一個工具包并不能滿足所有的要求,最近也不會開發(fā)一個可以滿足所有要求的 GUI 工具包。每個工具包都有各自的優(yōu)缺點,這樣就可以根據(jù)自己的需求和目標(biāo)用戶來選擇適當(dāng)?shù)墓ぞ甙?/span>
下面就讓我們來學(xué)習(xí)有關(guān)這些工具包的知識。
AWT 概述
Abstract Windows Toolkit(AWT)是最原始的 Java GUI 工具包。AWT 的主要優(yōu)點是,它在 Java 技術(shù)的每個版本上都成為了一種標(biāo)準(zhǔn)配置,包括早期的 Web 瀏覽器中的 Java 實現(xiàn);另外它也非常穩(wěn)定。這意味著我們不需要單獨安裝這個工具包,在任何一個 Java 運行環(huán)境中都可以使用它,這一點正是我們所希望的特性。
AWT 是一個非常簡單的具有有限 GUI 組件、布局管理器和事件的工具包(參見 清單 1、清單 2 和 清單 3)。這是因為 Sun 公司決定為 AWT 使用一種最小公分母(LCD)的方法。因此它只會使用為所有 Java 主機環(huán)境定義的 GUI 組件。最終的結(jié)果非常不幸,有些經(jīng)常使用的組件,例如表、樹、進(jìn)度條等,都不支持。對于需要更多組件類型的應(yīng)用程序來說,我們需要從頭開始創(chuàng)建這些組件。這是一個很大的負(fù)擔(dān)。
清單 1. 基本的 AWT Class 樹(全部在 java.awt 包中, “*” 表示抽象)
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 提供了下面的布局管理器(全部在 java.awt 包中,“*” 表示接口)
*LayoutManager FlowLayout GridLayout *LayoutManager2 BorderLayout CardLayout GridBagLayout
注意:另外幾個包中還有一些 AWT 布局管理器,很多都是為它們進(jìn)行布局的容器專門定制的,但是這是基本的布局管理器集。
清單 3. AWT 提供了以下事件(大部分在 java.awt.events 包中)
Object EventObject AWTEvent ActionEvent AdjustmentEvent ComponentEvent ContainerEvent FocusEvent InputEvent KeyEvent MouseEvent MouseWheelEvent PaintEvent WindowEvent HierarchyEvent InputMethodEvent InvocationEvent ItemEvent TextEvent
注意:其他幾個包中還有另外一些 AWT 事件,但是這是基本的事件集。這些是從更通用的事件生成的具體事件。
通常對于 AWT 來說(也適用于 Swing 和 SWT),每個事件類型都有一個相關(guān)的 XxxListener 接口(XxxAdapter 的實現(xiàn)可能為空),其中 Xxx 是去掉 Event 后綴的事件名(例如,KeyEvent 事件的接口是 KeyListener),用來把事件傳遞給處理程序。應(yīng)用程序會為自己感興趣處理的事件的事件源(GUI 組件或部件)進(jìn)行注冊。有時監(jiān)聽接口要處理多個事件。
AWT 的一個很好的特性是它通?梢詫 GUI 組件自動進(jìn)行銷毀。這意味著您幾乎不需要對組件進(jìn)行銷毀。一個例外是高級組件,例如對話框和框架。如果您創(chuàng)建了耗費大量主機資源的資源,就需要手動對其進(jìn)行銷毀。
AWT 組件是 “線程安全的(thread-safe)”,這意味著我們不需要關(guān)心在應(yīng)用程序中是哪一個線程對 GUI 進(jìn)行了更新。這個特性可以減少很多 GUI 更新的問題,不過使 AWT GUI 運行的速度更慢了。
AWT 讓我們可以以自頂向下(top-down) 或自底向上(bottom-up) 或以任意組合順序來構(gòu)建 GUI。自頂向下的意思是在創(chuàng)建子組件之前首先創(chuàng)建容器組件;自底向上的意思是在創(chuàng)建容器(或父)組件之前創(chuàng)建子組件。在后一種情況中,組件的存在并不依賴于父容器,其父容器可以隨時改變。
通常來說,AWT GUI 都是不可訪問的。系統(tǒng)并沒有為 AWT 程序員提供 API 來指定可訪問性信息?稍L問性(accessibility)處理的是殘疾人可以怎樣使用應(yīng)用程序的問題。一個應(yīng)用程序要想有很好的可訪問性,必須與運行平臺一起,讓殘疾人可以通過使用適當(dāng)?shù)妮o助技術(shù)(提供其他用戶接口的工具)來使用這些應(yīng)用程序。很多政府和企業(yè)都有一些強制要求應(yīng)用程序為實現(xiàn)可訪問性而采用的標(biāo)準(zhǔn)。
Sun 希望 Java 語言能夠成為一種 “編寫一次就可以隨處運行(write once, run everywhere,即 WORE)” 的環(huán)境。這意味著可以在一臺機器上開發(fā)和測試 Java 代碼(例如在 Windows? 上),然后不經(jīng)測試就可以在另外一個 Java 主機上運行同樣的 Java 代碼。對于大部分情況來說,Java 技術(shù)都可以成功實現(xiàn)這種功能,但是 AWT 卻是一個弱點。由于 AWT 要依賴于主機 GUI 的對等體(peer)控件(其中每個 AWT 組件都有一個并行的主機控件或者對等體)來實現(xiàn)這個 GUI,這個 GUI 的外觀和行為(這一點更重要)在不同的主機上會有所不同。這會導(dǎo)致出現(xiàn) “編寫一次隨處測試(write once, test everywhere,即 WOTE)” 的情況,這樣就遠(yuǎn)遠(yuǎn)不能滿足我們的要求了。
AWT 提供了一個豐富的圖形環(huán)境,尤其是在 Java V1.2 及其以后版本中更是如此。通過 Graphics2D 對象和 Java2D、Java3D 服務(wù),我們可以創(chuàng)建很多功能強大的圖形應(yīng)用程序,例如畫圖和制表包;結(jié)合使用 JavaSound,我們還可以創(chuàng)建非常有競爭力的交互式游戲。
Swing 概述
Java Swing 是 Java Foundation Classes(JFC)的一部分,它是試圖解決 AWT 缺點的一個嘗試。在 Swing 中,Sun 開發(fā)了一個經(jīng)過仔細(xì)設(shè)計的、靈活而強大的 GUI 工具包。不幸的是,這意味著我們又要花一些時間來學(xué)習(xí) Swing 了,對于常見的情況來說,Swing 有些太復(fù)雜了。
Swing 是在 AWT 組件基礎(chǔ)上構(gòu)建的。所有 Swing 組件實際上也是 AWT 的一部分。Swing 使用了 AWT 的事件模型和支持類,例如 Colors、Images 和 Graphics。Swing 組件、布局管理器以及事件總結(jié)如下(參見 清單 4、清單 5 和 清單 6)。正如您可以看到的一樣,這些組件集比 AWT 提供的組件集更為廣泛,與 SWT 組件集相比也毫不遜色。
清單 4. 基本的 Swing Class 樹(全部在 javax.swing 包或其子包中,“*” 表示抽象類)
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(全部在 javax.swing 包或其子包中,“*” 表示接口)
*LayoutManager CenterLayout *LayoutManager2 BoxLayout OverlayLayout SpringLayout
注意:在另外幾個包中還有其他一些 Swing 布局管理器,很多都是為它們所布局的容器而專門定制的,但是這是基本的布局管理器集。
清單 6. Swing 提供了以下事件(大部分在 javax.swing.events 包及其子包中)
Object EventObject AWTEvent AncestorEvent ComponentEvent InputEvent KeyEvent MenuKeyEvent MouseEvent MenuDragMouseEvent InternalFrameEvent
注意:在另外幾個包中還有其他一些 AWT 事件,但是這是基本的事件集。這些是從更通用的事件生成的 “高級” 事件。
為了克服在不同主機上行為也會不同的缺點,Swing 將對主機控件的依賴性降至了最低。實際上,Swing 只為諸如窗口和框架之類的頂層 組件使用對等體。大部分組件(JComponent 及其子類)都是使用純 Java 代碼來模擬的。這意味著 Swing 天生就可以在所有主機之間很好地進(jìn)行移植。因此,Swing 通?雌饋聿⒉幌袷潜镜爻绦颉嶋H上,它有很多外觀,有些模擬(盡管通常并不精確)不同主機的外觀,有些則提供了獨特的外觀。
Swing 對基于對等體的組件使用的術(shù)語是重量級(heavyweight),對于模擬的組件使用的術(shù)語是輕量級(lightweight)。實際上,Swing 可以支持在一個 GUI 中混合使用重量級組件和輕量級組件,例如在一個 JContainer 中混合使用 AWT 和 Swing 控件,但是如果組件產(chǎn)生了重疊,就必須注意繪制這些控件的順序。
Swing 無法充分利用硬件 GUI 加速器和專用主機 GUI 操作的優(yōu)點。結(jié)果是 Swing 應(yīng)用程序可能比本地 GUI 的程序運行速度都慢。Sun 花費了大量的精力來改進(jìn)最近版本的 Swing (Java V1.4 和 1.5)的性能,這種缺點正在變得日益微弱。由于 Swing 的設(shè)計更加健壯,因此其代碼基礎(chǔ)也更堅實。這意味著它可以在一臺健壯的機器上比 AWT 和 SWT 上運行得更好。
除了具有更多的組件、布局管理器和事件之外,Swing 還有很多特性使得自己比 AWT 的功能更加強大。下面是更為重要的幾個特性:
模型與視圖和控件分離
對于這個模型中的所有組件(例如按鈕、列表、表、樹、富文本)來說,模型都是與組件分離的。這樣可以根據(jù)應(yīng)用程序的需求來采用模型,并在多個視圖之間進(jìn)行共享。為了方便起見,每個組件類型都提供有默認(rèn)的模型。
可編程外觀
每個組件的外觀(外表以及如何處理輸入事件)都是由一個單獨的、可動態(tài)替換的實現(xiàn)來進(jìn)行控制的。這樣我們就可以改變基于 Swing 的 GUI 的部分或全部外觀。
呈現(xiàn)器和編輯器
大部分顯示模型內(nèi)容的組件,例如列表、表和樹,都可以處理幾乎所有類型的模型元素。這可以通過為每種組件類型和模型類型映射一個渲染器或編輯器來實現(xiàn)。例如,一個具有包含 java.util.Date 值的列的表可以有一些專用的代碼來呈現(xiàn)數(shù)據(jù)值和編輯數(shù)據(jù)值。每一列都可以有不同的類型。
可訪問性
創(chuàng)建一個殘疾人可以訪問的 GUI 是非常重要的。Swing 為實現(xiàn)具有可訪問性的 GUI 提供了豐富的基礎(chǔ)設(shè)施和 API。這種支持是單獨的,但是如果主機上具有可訪問性支持,那么它們應(yīng)該集成在一起。
與 AWT 一樣,Swing 可以支持 GUI 組件的自動銷毀。Swing 還可以支持 AWT 的自底向上和自頂向下的構(gòu)建方法。
與 AWT 不同,Swing 組件不是線程安全的,這意味著您需要關(guān)心在應(yīng)用程序中是哪個線程在更新 GUI。如果在使用線程時出現(xiàn)了錯誤,就可能會出現(xiàn)不可預(yù)測的行為,包括用戶界面故障。有一些工具可以幫助管理線程的問題。
與 AWT 類似,Swing 的一個優(yōu)點是,它也是 Java 技術(shù)的一種標(biāo)準(zhǔn)配置。這意味著您不需要自己來安裝它了。不幸的是,Swing 已經(jīng)有了很大的變化,因此它很容易變得依賴于最新版本的 Java 語言所提供的特性,這可能會強制用戶更新自己的 Java 運行時環(huán)境。
【Java GUI:SWT/Swing/AWT的介紹及比較】相關(guān)文章:
java的swing單選框用法示例05-14
使用Java編寫GUI對話框教程講解04-30
如何用Java創(chuàng)建一個簡單的Swing應(yīng)用程序05-22
JAVA語言和PHP語言的比較05-09
Java抽象類和接口的比較08-01
php和java比較優(yōu)勢在哪04-20
Java接口介紹05-08