熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

SWT和Swing代碼的區別

2013-11-23 19:08:16  來源: Java核心技術 

  筆者過去學習過Swing(也算是AWT的增強版吧) 現在開始學習一下 SWT 還沒有開始深入 JFace 和 RCP 一步步來吧 先學好基礎的 又不用著急做項目用 本文討論的內容僅限於我已知的 SWT和Swing 范圍 希望能對有 Swing 經驗的人快速了解 SWT 有所幫助

  第一個不同點就是 SWT 的類庫結構不像 Swing 沒有單一的父組件 SWT 中有好幾個父類

  ◆Widget —— 基本的 SWT GUI 組件(類似於 Java AWT 中的 Component 和 Swing 中的 JComponent)Widget 是一個抽象類

  ◆Control —— 擁有操作系統的對等物的窗口小部件(換句話說在操作系統中具有同一身份)Control 是一個抽象類

  ◆Composite —— 包含其他控件的控件(類似於 Java AWT 中的 Container 和 Swing 中的 JPanel)

  ◆Item —— 其他控件包含的窗口小部件(該控件可能不是復合控件)比如列表和表注意包含一些項的控件很少包含其他控件反之亦然Item 是一個抽象類

  SWT 的組件不能隨意繼承 其源代碼中會標注 IMPORTANT This class is <em>not</em> intended to be subclassed如果你那樣做了 運行的時候 SWT 系統就會報錯 也不能任意包含子組件 某些組件 例如 Tree 只能接收 TreeItem 作為其子組件 這樣在寫一些可重用的圖形組件的時候必須注意 Swing 中的寫法不能直接套用在 SWT 中

  Swing 的所有圖形界面類都繼承自 javaawtContainer 這意味著所有的 Swing 組件都可以包含任意的子組件 也可以被繼承 這是兩個類庫的第一個不同點

  第二個不同點就是 SWT 沒有利用 Java 的自帶垃圾收集功能來管理對象的銷毀  大部分對象都必須調用 dispose() 方可完成資源的釋放

  第三個不同點就是在組件的顯示上 SWT 抽象了一個 Display 對象來處理 SWT 和操作系統底層組件的通信 資源申請釋放 事件循環 任何顯示的 SWT 組件必須有且僅有一個 Display 對象

  第四個不同點就是 Swing 的組件實現了 MVC 機制 但是 SWT 沒有(目前來看)提供 MVC 機制 也就是說絕大多數 SWT 組件都是不可以更換顯示的外觀的 我的意思是例如像皮膚這樣的機制 例如實現一個 Office 外觀的橙色菜單條的顯示 SWT 是不能通過簡單的編碼來實現的(也許有 但是還沒找到相關的資料)

  SWT 的每個組件對象提供了 setData(Object) 這樣的方法來給組件存儲一個或者多個數據對象 Swing 中沒有類似的概念

  第五個不同點就是絕大多數的 SWT 組件創建的時候都必須指定父組件和風格屬性 也就是必須有一個 parent 對象 也不能運行的時候動態變更父組件 具體例如 Menu 對象裡有 Decorations getParent () 但是並無對應的 setParent() 方法 組件創建之後即自動加入父組件成為其一員 這和 Swing 的必須通過 add() 方法來加入父組件是不一樣的 大多數的 SWT 組件不提供無參數的構造器 這就意味這他們不是 JavaBean 這點上 Swing 的絕大多數組件都是 JavaBean

  總結以上這些內容我們可以感覺到 SWT 更像是操作系統本地組件的一種封裝 而不是基於 Java OO 的概念對其進行映射 其優點就是數據結構簡單

  好了 接下來還是通過一些SWT和Swing的代碼來比較吧第一個是經典的 Hello World

  SWT 版本

  

  import orgeclipseswtwidgets*;

  public class SWTHelloWorld {

  public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shellsetText(Hello World!);
shellopen();
while (!shellisDisposed()) {
if (!displayreadAndDispatch())
displaysleep();
}
displaydispose();
}
}

  Swing 版本

  

  import javaxswingJFrame;

  public class SwingHelloWorld {

  public static void main(String[] args) {
JFrame frame = new JFrame();
framesetTitle(Hello World!);
framesetDefaultCloseOperation(JFrameDISPOSE_ON_CLOSE);
framesetSize( );
framesetVisible(true);
}
}

  SWT 的 Text 屬性在不同的組件中有不同的意思 對於窗體來說它是標題 對於控件來說它是顯示的文本 Swing 中這個是分開的 對於窗口來說是 Title 屬性 對於控件來說是 Text 屬性 SWT 的事件循環基於顯式的 while 模式 而 Swing 已經在底層封裝好了事件的循環和處理 所以這兩段代碼最明顯的不同就是 SWT 多了時間循環的部分 即文中粗體的部分

  接著我們來看看繼承 SWT 的組件會有什麼後果 在 Swing 中繼承一個組件然後向其中添加子組件 例如建立一個自定義的工具欄 然後向其中加入子欄目 並最後顯示出來 這是經常進行的操作 再看看 SWT 中

  

  import orgeclipseswtwidgetsDisplay;
import orgeclipseswtwidgetsShell;
import orgeclipseswtwidgetsToolItem;
import orgeclipseswtSWT;

  public class NewToolBar extends orgeclipseswtwidgetsToolBar {

  public static void main(String[] args) {
try {
Display display = DisplaygetDefault();
Shell shell = new Shell(display);
new NewToolBar(shell SWTNULL);

  shellopen();
while (!shellisDisposed()) {
if (!displayreadAndDispatch())
displaysleep();
}
} catch (Exception e) {
eprintStackTrace();
}
}

  public NewToolBar(Shell parent int style) {
super(parent style);
new ToolItem(this SWTNULL);
}

  }

  以上是SWT和Swing代碼的區別


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26347.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.