SWT和Swing代碼的區(qū)別
筆者過去學習過Swing(也算是AWT的增強版吧), 現(xiàn)在開始學習一下 SWT, 還沒有開始深入 JFace 和 RCP, 一步步來吧. 先學好基礎(chǔ)的, 又不用著急做項目用. 本文討論的內(nèi)容僅限于我已知的 SWT和Swing 范圍, 希望能對有 Swing 經(jīng)驗的人快速了解 SWT 有所幫助.
***個不同點就是 SWT 的類庫結(jié)構(gòu)不像 Swing, 沒有單一的父組件. SWT 中有好幾個父類:
◆Widget —— 基本的 SWT GUI 組件(類似于 Java AWT 中的 Component 和 Swing 中的 JComponent)。Widget 是一個抽象類。
◆Control —— 擁有操作系統(tǒng)的對等物的窗口小部件(換句話說,在操作系統(tǒng)中具有同一身份)。Control 是一個抽象類。
◆Composite —— 包含其他控件的控件(類似于 Java AWT 中的 Container 和 Swing 中的 JPanel)。
◆Item —— 其他控件包含的窗口小部件(該控件可能不是復(fù)合控件),比如列表和表。注意,包含一些項的控件很少包含其他控件,反之亦然。Item 是一個抽象類。
SWT 的組件不能隨意繼承, 其源代碼中會標注: IMPORTANT: This class is <em>not</em> intended to be subclassed.如果你那樣做了, 運行的時候 SWT 系統(tǒng)就會報錯, 也不能任意包含子組件. 某些組件, 例如 Tree, 只能接收 TreeItem 作為其子組件. 這樣在寫一些可重用的圖形組件的時候必須注意, Swing 中的寫法不能直接套用在 SWT 中.
Swing 的所有圖形界面類都繼承自 java.awt.Container, 這意味著所有的 Swing 組件都可以包含任意的子組件, 也可以被繼承. 這是兩個類庫的***個不同點.
第二個不同點就是 SWT 沒有利用 Java 的自帶垃圾收集功能來管理對象的銷毀, 大部分對象都必須調(diào)用 dispose() 方可完成資源的釋放.
第三個不同點就是在組件的顯示上, SWT 抽象了一個 Display 對象來處理 SWT 和操作系統(tǒng)底層組件的通信, 資源申請釋放, 事件循環(huán), 任何顯示的 SWT 組件必須有且僅有一個 Display 對象.
第四個不同點就是 Swing 的組件實現(xiàn)了 MVC 機制, 但是 SWT 沒有(目前來看)提供 MVC 機制. 也就是說絕大多數(shù) SWT 組件都是不可以更換顯示的外觀的, 我的意思是例如像皮膚這樣的機制, 例如:實現(xiàn)一個 Office 2003 外觀的橙色菜單條的顯示, SWT 是不能通過簡單的編碼來實現(xiàn)的(也許有, 但是還沒找到相關(guān)的資料).
SWT 的每個組件對象提供了 setData(Object) 這樣的方法來給組件存儲一個或者多個數(shù)據(jù)對象, Swing 中沒有類似的概念.
第五個不同點就是絕大多數(shù)的 SWT 組件創(chuàng)建的時候都必須指定父組件和風格屬性, 也就是必須有一個 parent 對象, 也不能運行的時候動態(tài)變更父組件, 具體例如 Menu 對象里有 Decorations getParent () , 但是并無對應(yīng)的 setParent() 方法. 組件創(chuàng)建之后即自動加入父組件成為其一員, 這和 Swing 的必須通過 add() 方法來加入父組件是不一樣的. 大多數(shù)的 SWT 組件不提供無參數(shù)的構(gòu)造器, 這就意味這他們不是 JavaBean, 這點上 Swing 的絕大多數(shù)組件都是 JavaBean.
總結(jié)以上這些內(nèi)容我們可以感覺到 SWT 更像是操作系統(tǒng)本地組件的一種封裝, 而不是基于 Java OO 的概念對其進行映射, 其優(yōu)點就是數(shù)據(jù)結(jié)構(gòu)簡單.
好了, 接下來還是通過一些SWT和Swing的代碼來比較吧.***個是經(jīng)典的 Hello World
SWT 版本
- import org.eclipse.swt.widgets.*;
- public class SWTHelloWorld {
- public static void main(String[] args) {
- Display display = new Display();
- Shell shell = new Shell(display);
- shell.setText("Hello World!");
- shell.open();
- while (!shell.isDisposed()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
- display.dispose();
- }
- }
Swing 版本
- import javax.swing.JFrame;
- public class SwingHelloWorld {
- public static void main(String[] args) {
- JFrame frame = new JFrame();
- frame.setTitle("Hello World!");
- frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
- frame.setSize(400, 400);
- frame.setVisible(true);
- }
- }
SWT 的 Text 屬性在不同的組件中有不同的意思, 對于窗體來說它是標題, 對于控件來說它是顯示的文本, Swing 中這個是分開的, 對于窗口來說是 Title 屬性, 對于控件來說是 Text 屬性. SWT 的事件循環(huán)基于顯式的 while 模式, 而 Swing 已經(jīng)在底層封裝好了事件的循環(huán)和處理. 所以這兩段代碼最明顯的不同就是 SWT 多了時間循環(huán)的部分, 即文中粗體的部分.
接著我們來看看繼承 SWT 的組件會有什么后果. 在 Swing 中繼承一個組件然后向其中添加子組件, 例如建立一個自定義的工具欄, 然后向其中加入子欄目, 并***顯示出來, 這是經(jīng)常進行的操作, 再看看 SWT 中:
- import org.eclipse.swt.widgets.Display;
- import org.eclipse.swt.widgets.Shell;
- import org.eclipse.swt.widgets.ToolItem;
- import org.eclipse.swt.SWT;
- public class NewToolBar extends org.eclipse.swt.widgets.ToolBar {
- public static void main(String[] args) {
- try {
- Display display = Display.getDefault();
- Shell shell = new Shell(display);
- new NewToolBar(shell, SWT.NULL);
- shell.open();
- while (!shell.isDisposed()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public NewToolBar(Shell parent, int style) {
- super(parent, style);
- new ToolItem(this, SWT.NULL);
- }
- }
以上是SWT和Swing代碼的區(qū)別
【編輯推薦】