淺析Swing.SWT和AWT的區別
上一篇的比較主要是在API級別上的。讓我們將比較的焦點轉移到實現細節上。Swing.SWT和AWT的區別是Swing是純Java實現,而SWT和AWT是Java和JNI的混合。當然,它們的目標都是相同的,提供一個跨平臺的APIs。然而為了達到這一點,SWT和AWT不得不犧牲一些組件和特性以提供一個通用的APIs。

AWT
一個AWT組件通常是一個包含了對等體接口類型引用的組件類。這個引用指向本地對等體實現。舉java.awt.Label為例,它的對等體接口是 LabelPeer。LabelPeer是平臺無關的。在不同平臺上,AWT提供不同的對等體類來實現LabelPeer。在Windows上,對等體類是WlabelPeer,它調用JNI來實現label的功能。這些JNI方法用C或C++編寫。它們關聯一個本地的label,真正的行為都在這里發生。作為整體,AWT組件由AWT組件類和AWT對等體提供了一個全局公用的API給應用程序使用。一個組件類和它的對等體接口是平臺無關的。底層的對等體類和JNI代碼是平臺相關的。
SWT
SWT也使用JNI的方法論來實現。但細節不同于AWT。SWT的擁護者聽到人們拿SWT和AWT相提并論可是會很生氣的,Steve Northover,SWT之父,就曾為此抱怨過。
沒錯,它們是不同的。讓我們深究SWT的代碼。在SWT中,各個平臺上唯一相同的部分是組件的接口,是類和方法的定義簽名。所有的底層代碼都是平臺差異的。 SWT為每個平臺提供了OS類。這個類用JNI封裝了許多本地APIs。SWT組件類通過把這些JNI方法黏合在一起提供一個有意義的功能。
例如,在Windows上,文本域的選擇是由一個系統調用處理的。這個系統調用在Windows的OS類中作為一個本地方法實現。所以在Windows平臺的Text的setSelection方法中只用到了一個JNI調用。
然而,在motif上,文本域的選擇包含兩個本地調用。SWT就在motif的OS類中實現了兩個調用。所以在motif上組件類需要作兩次調用來實現文本的選擇。

現在你應該能看出SWT和AWT的***不同了,它們使用了不同的對等體編程方式來消除平臺差異。SWT用java代碼或有JNI實現的java對等體來黏合系統調用。而AWT把代碼包含在對等體中,使情況復雜化了,我個人覺得SWT的方法更加明智。[是否我翻譯有問題,因為我并不覺得是這樣更明智,SWT 的無則模擬是不必要的,這是使用者才去做的事,SWT作為提供者應該無則C++實現,當然實現的是最核心的高度復用的又或者需要極大性能支持的,畢竟帶了動態鏈接庫,索性多放點東西。
Swing
到了Swing這里,一切就變得清晰和直接了。除了頂層容器,Swing的實現不依賴于具體平臺。它掌管了所有的控制和資源。Swing所需要的是事件輸入來驅動系統,以及承接自頂層AWT容器的圖形處理,字體和顏色。普通的Swing組件可以看作是AWT容器的一塊邏輯區域。它們并沒有注冊對等體。所有添加到同一頂層容器的Swing組件共享它的AWT對等體以獲取系統資源,如字體,圖形處理等。Swing將組件自己的數據結構存儲在JVM的空間中。它完全由自己管理畫圖處理,事件分發和組件布局。
【編輯推薦】

















