(轉載)總結SWT的幾點不足

產品的遷移工作接近尾聲了,在這次遷移中,首次使用SWT,沒什麼SWT方面的經驗,雖然我負責的是外圍模塊,使用SWT不是很多,但也算見識了SWT的一些優點和不足(指我認爲的不足),這幾點給我們的計劃帶來了不少影響,導致進度一拖再拖,發佈日期一變再變,以後再用SWT,要長些心眼。以下就是我認爲的SWT的幾點不足:

 

1、SWT對象的構造,總要以父容器爲參數傳進構造函數,如在shell中加入一個button,對比AWT或Swing,會發現基本是倒過來一樣。這個倒不能說是不足,還有些人說SWT的寫法更符合面向對象的理念,但我總覺得有點彆扭,特別是熟悉AWT的寫法之後,再來用SWT,就算SWT的寫法是對的,心裏面還是覺得不應該這樣做。這也有點習慣在捉弄吧。

[java] view plaincopy
  1. SWT寫法:  
  2. Button button = new Button(shell, SWT.NONE);  
  3. button.setText("OK");  
  4. AWT寫法:  
  5. Button button = new Button("OK");  
  6. panel.add(button);  


2、SWT多平臺支持。由於產品需要支持MacOS、AIX、Soloris power pc/x86、HPUX、Linux(redhat/ubuntu/suse...),在這多平臺支持上面的開發與調試,耗掉了不少的人日。SWT嚴重依賴於系統底層,不同的系統,需要不同的SWT.jar才能使產品正常地運行,即使同一平臺,對Jar包的依賴也有點差異,這裏就拿滿地開花的Linux來說事了。本來產品用的Jar是拿eclipse 3.5的,在redhat/ubuntu/suse11上測試都沒問題,結果在suse10上測試就出問題了,調試了兩三天,最後換了eclipse3.4下面的SWT.jar,就能運行了,但3.4的SWT.jar與3.5的SWT.jar存在不少差異,也能隨便地把包降爲3.4,而且是核心包,更換後又要花大力氣測試,正可謂“這也不是,那也不是”。

 

3、SWT bit-version問題。這個問題我在 處理SWT bit版本與JDK bit版本的對應 做了說明,這又是一上讓人糾結的問題。在使用SWT的時候,特別要考慮好這個問題。其實,這個問題有一個方法比較容易處理,就是捆綁JRE,不允許用戶更改JRE,這樣就不存在這種問題了。而我們的產品雖然已經捆綁了JRE,但還是允許用戶選擇自己安裝的JRE,這樣就容易出現這種問題。我覺得這個也算是SWT的不足,嚴重依賴底層,不同bit-version的JVM支持不好。一般常識,32位的能在64位上跑,64的不能在32位上跑,但32位的SWT只能在32位JVM上跑,不能上64位JVM上跑。

 

4、SWT的多線程問題。雖然SWT提供了Display.asyncExec和Display.syncExec來處理多線程問題,但偶爾還是存在一些多線程的問題。比如,你在一個Composite裏面用多線程實現一個小球在滾動,然後直接點該小程序的“關閉”圖標,這時可能會報“wedget is disposed ” 異常。當然,這種問題也不能說是SWT控制得不好,完全可以改改代碼,把Display、Shell都做一下調整,就可以避免這種問題出現,但是這樣調整過的代碼,難免會讓人覺得“不是人寫的”(呵,說得有點誇張了)。

 

5、CheckBox、RadioBox的Text爲空或null時,在個別操作系統時會出現半個矩形的圖案。代碼如下所示,這種寫法在ubuntu11.4在運行時,點擊checkbox或radiobox,會在checkbox或radiobox的右側出現一個半矩形。按照SWT的規定,checkbox或radiobox的說明是寫在該控件的右側的,但有時候我們需要寫在控件的左側,這時就會把對應控件的Text設置爲空,這樣運行在ubuntu就出現這個問題,而在redhat、windows則不存在這個問題。這個問題確實不好解決,查找了很多資料,終於找到一個有用的鏈接了,原來這個問題是早就存在了,在eclipse3.5的時候就有人提過了(2010年提過。我們用的jar恰好是eclipse3.5的),並且提了PR給eclipse項目組,該PR的最近一次更新是2012年3月,這個問題還是沒給解決,部分人說這個不能算SWT的Bug,是因爲我們使用不當導致的,因爲給這些控件的Text設置非空值,也就是說控件的說明不能放在左側只能放在右側,呵呵,我們這回踩到地雷了,就按照他們說的做吧,雖然效果看起來差了點,但是再調整一下大小,可以彌補回這點不良效果的。該PR的鏈接是“checkBox with null text will display a empty rectangle

[java] view plaincopy
  1. Button checkbtn = new Button(shell, SWT.CHECK);  
  2. checkbtn.setText(null);//或 checkbtn.setText("");  
[java] view plaincopy
  1. //Button radiobtn = new Button(shell, SWT.RADIO);  
  2. radiobtn .setText(null);//或 radiobtn .setText("");  


以上幾點就是最近使用SWT的幾點總結,說是SWT的不足,主要是要給自己提個醒,以後要注意一點,SWT不能什麼都給你準備好。瞭解得也不是很多,在後續的日子再認真研究一下SWT,這個跟Swing搶天下的組件。


出處:http://blog.csdn.net/neetgo/article/details/7866475

發佈了27 篇原創文章 · 獲贊 40 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章