全面比較AWT和Swing
比較AWT和Swing
1.AWT和Swing組件體系
a)Swing:通過在父組件上動(dòng)態(tài)調(diào)用add()和remove()方法,來對(duì)組件樹進(jìn)行動(dòng)態(tài)維護(hù),因此,可以存在沒有父組件的子組件。
b)SWT:通過在構(gòu)造函數(shù)的參數(shù)中,指定父組件,因此,不可能存在沒有父組件的子組件。
2.AWT和Swing組件繪制
a)Swing:通過調(diào)用組件的paint()方法來進(jìn)行組件的繪制,組件進(jìn)一步對(duì)他的子組件調(diào)用paint(),從而完成整棵組件樹的繪制。通過子類化,重寫paint()方法,可以完全定制一個(gè)組件的繪制。
b)SWT:SWT組件只是本地平臺(tái)上實(shí)際組件的一個(gè)代理,實(shí)際組件采用win32編程方式進(jìn)行繪制,繪制的過程不在JVM中完成。因此,子類化也不能對(duì)繪制進(jìn)行完全定制。當(dāng)SWT組件進(jìn)行繪制時(shí),他在完成了本地的繪制以后,會(huì)返回JVM,然后對(duì)所有已注冊(cè)的PaintListener發(fā)出通知,因此,通過注冊(cè)PaintListener可以對(duì)組件繪制進(jìn)行一定程度上的修改。
3.AWT和Swing事件模型
a)Swing中的事件會(huì)跟據(jù)當(dāng)前的焦點(diǎn)進(jìn)行發(fā)送。父組件不能對(duì)事件進(jìn)行過濾。Swing中的事件監(jiān)聽器都是有類型的,因此每個(gè)組件所能支持的事件類型是通過方法名來限定的。不能擴(kuò)展。
b)SWT中的事件也是根據(jù)當(dāng)前的焦點(diǎn)進(jìn)行發(fā)送。父組件不能對(duì)事件進(jìn)行過濾。SWT中支持有類型的監(jiān)聽器,也支持無類型的監(jiān)聽器,通過addListener(type,listener),我們可以為組件添加任何類型的監(jiān)聽器。
4.AWT和Swing包設(shè)計(jì)
a)Swing是一個(gè)純粹的組件庫(kù),他沒有圖形的操作,他的繪制最終轉(zhuǎn)發(fā)給Java 2D來完成。
b)SWT包含了組件庫(kù)和圖形庫(kù),他的結(jié)構(gòu)與AWT比較接近。
5. 其它
AWT和SWT實(shí)現(xiàn)原理不同:AWT控件相當(dāng)于是一筆一畫繡出來的,參加 java.awt.Component.paint(Graphics g),性能差;而SWT調(diào)用了操作系統(tǒng)后臺(tái)原生庫(kù),org.eclipse.swt.widgets.Control類型中就沒有類似的paint方法了,但是有一個(gè)接口org.eclipse.swt.graphics.Drawable。實(shí)現(xiàn)原理的不同帶來了性能和用戶視覺的差異。
SWING 是基于AWT提供的MVC不完全實(shí)現(xiàn),JFACE是基于SWT提供的MVC不完全實(shí)現(xiàn)。兩者的核心作用都是提供了viewer和模型封裝的概念,從設(shè)計(jì)實(shí)現(xiàn)層面看,SWING更加唯美一些,JFACE則更加側(cè)重于實(shí)用。SWING和 JFACE兩者都偏重于行為控制上下文,而對(duì)UI數(shù)據(jù)(例如,一個(gè)文本框控件中的內(nèi)容)的管理都沒有做太多的設(shè)計(jì)。JFACE中略有改進(jìn),提供了 setData的概念。JFACE是為了Eclipse而生的,雖然后來 RCP出來了,又做了其他的包裝宣傳,典型的體現(xiàn)就是提供了JFace Text Framework和其他一些用戶構(gòu)建Eclipse元素的UI支持,也提供了一些系統(tǒng)資源管理(ImageRegsitry、 ResourceManager等)等附加功能。
SWING框架與代碼很優(yōu)美,但效率低,特別是高級(jí)控件如各種選擇框超慢,與Windows本身不協(xié)調(diào),使用體驗(yàn)差;而且再怎么使用LookAndFeel,還是不美觀,總是感覺畫的不清晰。
【編輯推薦】