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 樹(全部在 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 布局管理器,很多都是為它們進行布局的容器專門定制的,但是這是基本的布局管理器集。
清單 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),每個事件類型都有一個相關的 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 樹(全部在 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 天生就可以在所有主機之間很好地進行移植。是以,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 的部分或全部外觀。
- 呈現器和編輯器
- 大部分顯示模型内容的元件,例如清單、表和樹,都可以處理幾乎所有類型的模型元素。這可以通過為每種元件類型和模型類型映射一個渲染器或編輯器來實作。例如,一個具有包含
值的列的表可以有一些專用的代碼來呈現資料值和編輯資料值。每一列都可以有不同的類型。java.util.Date
- 可通路性
- 建立一個殘障人士可以通路的 GUI 是非常重要的。Swing 為實作具有可通路性的 GUI 提供了豐富的基礎設施和 API。這種支援是單獨的,但是如果主機上具有可通路性支援,那麼它們應該內建在一起。
與 AWT 一樣,Swing 可以支援 GUI 元件的自動銷毀。Swing 還可以支援 AWT 的自底向上和自頂向下的建構方法。
與 AWT 不同,Swing 元件不是線程安全的,這意味着您需要關心在應用程式中是哪個線程在更新 GUI。如果在使用線程時出現了錯誤,就可能會出現不可預測的行為,包括使用者界面故障。有一些工具可以幫助管理線程的問題。
與 AWT 類似,Swing 的一個優點是,它也是 Java 技術的一種标準配置。這意味着您不需要自己來安裝它了。不幸的是,Swing 已經有了很大的變化,是以它很容易變得依賴于最新版本的 Java 語言所提供的特性,這可能會強制使用者更新自己的 Java 運作時環境。
回頁首
SWT 概述
與 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 那麼優秀,但是它在建立可移植解決方案方面是很傑出的。
SWT 部件、布局和事件總結如下(參見 清單 7、清單 8 和 清單 9)。正如您可以看到的一樣,這些元件集比 AWT 提供的元件集更為廣泛,與 Swing 元件集相比也毫不遜色。
清單 7. 基本的 SWT Class 樹(大部分在 org.ecipse.swt.widgets 或 org.eclipse.swt.custom 包或子包中,“*” 表示抽象類,“!” 表示在 custom 包中,“~” 表示在其他包中)
Object
*Dialog
ColorDialog
DirectoryDialog
FileDialog
FontDialog
MessageDialog
PrintDialog
*Widget
Menu
*Item
CoolItem
!CTabItem
MenuItem
TabItem
TableColumn
TableItem
TableTreeItem
ToolItem
TrayItem
TreeColumn
TreeItem
*Control
Button
Label
ProgressBar
Sash
Scale
Scrollable
Composite
~Browser
Canvas
*~AbstractHyperlink
~Hyperlink
~ImageHyperlink
*~ToggleHyperline
~TreeNode
~Twistie
AnimatedProgress
!CLabel
Decorations
Shell
FormText
StyledText
TableCursor
!CBanner
!CCombo
Combo
CoolBar
!CTabFolder
~ExpandableComposite
~Section
~FilteredList
~FilteredTree
~Form
Group
~PageBook
ProgressIndicator
!SashForm
!ScrolledComposite
TabFolder
Table
TableTree
ToolBar
Tray
Tree
ViewForm
List
Text
Slider
注意:在另外幾個包中還有其他一些 SWT 部件,但是這是基本的部件集。
與 AWT 和 Swing 布局管理器類似,SWT 也提供了非常豐富的布局部件集。布局系統與嵌套容器一起使用,可以生成所需要的任何布局算法。所有這 3 個 GUI 庫也可以支援對部件的定位實作絕對控制。SWT 沒有等效的 BorderLayout 部件,這一點非常令人失望。FormLayout 對于建立表單基本輸入來說非常好用。我認為 SWT 的布局機制比 AWT/Swing 布局部件集的使用更難學習。
清單 8. SWT 提供了以下布局管理器(大部分在 org.eclipse.swt.layout 和 org.eclipse.swt.custom 包或子包中,“*” 表示接口,“!” 表示在 custom 包中)
*Layout
FillLayout
FormLayout
GridLayout
RowLayout
!StackLayout
注意:在另外幾個包中還有其他一些 SWT 布局管理器,很多都是為它們所布局的容器而專門定制的,但是這是基本的布局管理器集。
與 AWT 和 Swing 事件系統一樣,SWT 提供了非常豐富的事件集。盡管這些事件并不能與 AWT/Swing 的事件一一對應(例如 AWT 和 Swing 的按鈕都會産生 ActionEvent 事件,而 SWT 的按鈕産生的則是 SelectionEvent 事件),但是它們通常都是等價的。
清單 9. SWT 提供了以下事件(大部分在 org.eclipse.swt.events 包或 org.eclipse.swt.custom 包或其子包中,“*” 表示抽象,“!” 表示在 custom 包中)
Object
EventObject
SWTEventObject
TypedEvent
AimEvent
!BidiSegmentEvent
ControlEvent
!CTabFlolderEvent
DisposeEvent
DragSourceEvent
DragTargetEvent
!ExtendedModifyEvent
focusEvent
HelpEvent
KeyEvent
TraverseEvent
VerifyEvent
!LineBackgroundEvent
!LineStyleEvent
MenuEvent
ModifyEvent
MouseEvent
PaintEvent
SelectionEvent
TreeEvent
ShellEvent
!TextChangedEvent
!TextChangingEvent
注意:在另外幾個包中還有其他一些 SWT 事件,但是這是基本的事件集。這些是從更通用的事件生成的具體事件。
很多 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 中。
回頁首
特性的比較
下表對 AWT、SWT 和 Swing 庫的很多特性進行了比較,這種比較并沒有按照任何特定順序來進行。盡管沒有完全列出所有特性,但是列出了很多最重要的特性。
表 1. SWT 、AWT 和 Swing 特性的比較
功能/角色/外表 | AWT | Swing | SWT(風格) |
---|---|---|---|
顯示靜态文本 | Label | JLabel | Label, CLabel |
顯示多行靜态文本 | Multiple Labels | 具有 HTML 内容的 Multiple JLabels 或 JLabel | 具有新行的 Multiple Labels 或 Label |
顯示多行格式化靜态文本 | 具有不同字型的 Multiple Labels | 具有 HTML 内容的 JLabel | 具有不同字型的 Multiple Labels |
單行文本輸入 | TextField | JTextField | Text(SWT.SINGLE) |
多行文本輸入 | TextArea | JTextArea | Text(SWT.MULTI) |
顯示圖像 | N/A | JLabel | Label |
顯示文本和圖像 | N/A | JLabel | CLabel |
提示彈出幫助 | N/A | 元件的 setToolTip,JToolTip 子類 | 控件的 setToolTip |
風格化的文本輸入 | N/A | JEditorPane | StyledText |
從條目清單中進行選擇 | List | JList | List |
簡單按下具有文本的按鈕 | Button | JButton | Button(SWT.PUSH) |
簡單按下具有文本或圖像的按鈕 | N/A | JButton | Button(SWT.PUSH) |
繪圖區域;可能用于定制控件 | Canvas | JPanel | Canvas |
選中/取消複選框 | CheckBox | JCheckBox | Button(SWT.CHECK) |
單選按鈕選擇 | CheckBoxGroup | ButtonGroup 和 Menu | Group 和 Menu |
從一個下拉清單中選擇 | Choice | JComboBox | Combo、CCombo |
輸入文本或從下拉清單中選擇 | N/A | JComboBox | Combo、CCombo |
可滾動區域 | ScrollPane | JScrollPane | 建立 Scrollable 子類 |
頂層視窗 | Dialog、Frame、Window | JDialog、JFrame、JWindow | 具有不同風格的 Shell |
通用視窗 | Window | JWindow | Shell |
架構視窗 | Frame | JFrame | Shell(SWT.SHELL_TRIM) |
對話框視窗 | Dialog | JDialog | Shell(SWT.DIALOG_TRIM) |
菜單 | Menu | JMenu | Menu |
MenuItem | MenuItem | JMenuItem | MenuItem |
菜單快捷鍵 | 通用擊鍵 | 與 AWT 相同 | 依賴于主機的快捷鍵 |
彈出菜單 | PopupMenu | JPopupMenu | Menu(SWT.POPUP) |
菜單條 | MenuBar | JMenuBar | Menu(SWT.BAR) |
顯示插入符号 | N/A | Caret | Caret |
Web 浏覽器 | N/A | JTextPane(HTML 3.2) | Browser(通過嵌入式浏覽器) |
Web 頁面中的嵌入式控件 | Applet | JApplet | 主機控件(例如 OLE) |
其他控件的通用容器 | Panel | JPanel | Composite |
其他控件的有邊界通用容器 | Panel(如果是手工畫的) | 具有 Border 的 JPanel | Composite(SWT.BORDER) |
其他控件的有邊界和标題的通用容器 | N/A | 具有 TitledBorder 的 JPanel | Group |
單選按鈕(一個被選中) | Checkbox | JRadioButton | Button(SWT.RADIO) |
單選按鈕的控件擴充 | CheckboxGroup | RadioButtonGroup | Group |
箭頭按鈕 | N/A | 具有圖像的 JButton | Button(SWT.ARROW) |
支援文本顯示方向 | 通過 ComponentOrientation | 與 AWT 相同 | 很多元件都可以支援這種風格 |
焦點切換 | Policy 和 Manager 對象 | 與 AWT 相同 | 下一個控件 |
定制對話框 | Dialog 子類 | JDialog 子類 | Dialog 子類 |
通路系統事件 | EventQueue 服務 | 與 AWT 相同 | Display 服務(不如 AWT 健壯) |
系統通路對話框 | FileDialog | JColorChooser、JFileChooser | ColorDialog、DirectoryDialog、FileDialog、FontDialog、PrintDialog |
顯示簡單消息對話框 | N/A(必須是 Dialog 子類) | JOptionPane 靜态方法 | 具有很多風格的 MessageBox |
顯示簡單提示對話框 | N/A(必須是 Dialog 子類) | JOptionPane 靜态方法 | N/A(JFace 中用來實作這種功能的子類) |
布局管理器 | BorderLayout、CardLayout、FlowLayout、GridLayout、GridBagLayout | AWT 加上 BoxLayout、CenterLayout、SpringLayout | FillLayout、FormLayout、GridLayout、RowLayout、StackLayout |
基本的繪圖控件 | Canvas | JPanel | Canvas |
基本繪圖 | Graphics 和 Graphics2D 對象 —— 基本形狀和文本,任意 Shapes 和 Strokes、Bezier 以及檔案 | 與 AWT 相同 | GC 對象 —— 基本形狀和文本 |
繪圖轉換 | Affine,合成 | 與 AWT 相同 | N/A |
離屏繪圖(Off screen drawing) | BufferedImage、drawImage | 與 AWT 相同 | Image、drawImage |
雙緩沖區 | 手工 | 自動或手工 | 除非由主機控件提供,否則就是手工 |
列印 | PrintJob 和 PrintGraphics | 與 AWT 相同 | 向 Printer 裝置繪圖 |
定制顔色 | Color | 與 AWT 相同 | Color |
定制字型 | Font、FontMetrics | 與 AWT 相同 | Font |
光标選擇 | Cursor | 與 AWT 相同 | Cursor |
圖像特性 | 從檔案中加載,動态建立,可擴充地編輯 | 與 AWT 相同 | 從檔案中加載,動态建立,基本編輯 |
輸入自動化 | Robot | 與 AWT 相同 | N/A |
顯示工具條 | N/A | JToolBar | ToolBar、CoolBar |
顯示進度條 | N/A | JProgressBar | ProgressBar |
将空間劃分成區域 | N/A | JSplitPane | Sash 或 SashForm |
顯示一個分标簽頁的區域 | N/A | JTabbedPane | TabFolder、CTabFolder |
顯示制表資訊 | N/A | JTable | Table |
格式化表的列 | N/A | TableColumn | TableColumn |
顯示階層化資訊 | N/A | JTree | Tree |
從一定範圍的值中進行選擇 | N/A | JSlider | Slider |
從一組離散範圍的值中進行選擇 | N/A | JSpinner | Scale |
對于基本顯示的通路 | Toolkit、GraphicsConfiguration、GraphicsDevice | 與 AWT 相同 | Display |
将條目添加到系統托盤(system tray)中 | N/A | N/A | Tray |
關鍵:N/A —— 不适用。在很多情況中,這種特性都可以通過建立定制控件或控件容器或利用其他定制程式設計來實作,不過實作的難度會有所不同。 |
回頁首
結束語
本文對 Eclipse 的 Standard Windows Toolkit with JFace、Java 的 Swing 和 Abstract Windows Toolkit GUI 工具包進行了比較。通過此處提供的比較,您可以确定在自己的新應用程式中應該使用哪個 GUI 工具包。
在大部分情況中,決定都是在 Swing 與結合了 JFace 的 SWT 之間進行的。通常來說,每個工具包都非常完整且功能強大,足以建構功能完善的 GUI,但是 Swing 通常要比單獨使用 SWT(不使用 JFace 時)更好。Swing 具有内嵌于 Java 技術的優點,是完全可移植的,無可争議地是一種更好的架構。Swing 也具有進階圖形應用程式所需要的優點。SWT 具有可以作為本地應用程式實作的優點,這可以提高性能,并利用基于 SWT 的 GUI 來實作本地相容性。
如果您隻為一種平台來開發系統,那麼 SWT 就具有主機相容性方面的優點,包括與主機特性的內建,例如在 Windows 上對 ActiveX 控件的使用。