還記得大學里給別人當廉價勞動力(做點小項目,改善點生活~_~)的時候用了不少AWT、SWING,當時也沒有太多去想(當然也沒有絲毫能力去亂想),就是單純地當API來用。工作之后,一直做插件開發,也接觸了SWT、JFACE,當然,經驗也談不上豐富,平時很少寫界面UI的東西。今天閑著,就閑侃一下。
【AWT和SWT】
眾所周知,AWT和swt實現原理是不一樣的:AWT控件相當于是一筆一畫繡出來的,參加
java.awt.Component.paint(Graphics g),性能可想而知了;而SWT中呢,是調用了操作系統后臺原生庫,org.eclipse.swt.widgets.Control類型中就沒有類似的paint方法了,但是有一個接口
org.eclipse.swt.graphics.Drawable,有興趣的TX可以看一下。
實現原理的不同帶來了性能和用戶視覺的差異,也就決定了AWT在某些應用場景下會被拋棄,SWT會被寵幸。
【SWING和JFACE】
SWING是基于AWT提供的MVC不完全實現,JFACE是基于SWT提供的MVC不完全實現,兩個小框架出來了。底層的AWT和SWT的取舍決定了是選擇SWING還是JFACE,雖然這樣,我們還是看一下兩者的主要差別和主要特點(個人意見、僅供參考)
1、兩者的核心作用都是提供了viewer和模型封裝的概念,盡管如此,從設計實現上面講,SWING更加唯美一些,JFACE則更加側重于實用
2、SWING和JFACE兩者都偏重于行為控制上下文,而對UI數據(例如,一個文本框控件中的內容)的管理都沒有做太多的設計。JFACE中略有改進,那就是提供了setData的概念,但是不好用~_~。其實說白了為什么沒有做這些的設計,估計是想把自由度開發給開發者,不想做過多的限制,畢竟SWING和JFACE兩個框架的核心就是去封裝底層控件。這間接給UI測試帶來了一些困難,設想如果沒一個Dialog都有一個數據池的概念,用戶的輸入會放入這個數據池,到dialog finish的時候,就從這個數據池中取數據,不再取訪問控件去數據,那么這樣在UI測試的時候可以更方便的去處理數據,很多時候不用去過多的利用鍵盤鉤子的東東
3、JFACE是為了Eclipse而生的,雖然后來RCP出來了,又做了其他的包裝宣傳,典型的體現就是提供了JFace Text Framework和其他一些用戶構建Eclipse元素的UI支持。當然,也提供了一些系統資源管理(ImageRegsitry、ResourceManager等)等附加功能。
4、SWING和JFACE都是提供了一個小框架,而且是MVC的不完全實現,并不是旨在解決UI創建的所有問題。當然,SWING相比JFACE來說更優雅一些,更mvc一些
【性能差距真那么大嗎?】
不完全是。看看人家SUN的高手用AWT和SWING做的IDE工具,有那么差嗎???為什么我們一般開發者用AWT和SWING做出來的UI,效果就差不少呢???水平,SUN牛!!!
【核心是什么】
我們在接觸這些東西的時候,最核心的在于什么。個人感覺如下:
1、基本機理,例如控件如何產生的、事件循環怎樣的、涉及到線程問題..
2、SWING和JFACE的MVC思想,本質中的本質。
3、JFACE提供的一些Eclipse特性的東西,例如JFace Text Framework、資源管理等
PS:SWING和JFACE的源碼質量都是很高很高的,可以經常撒兩眼~_~
歡迎拍磚!
本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!