推薦書籍
SWT: The Standard Widget Toolkit - Steve Northover, Mike Wilson
The Definitive Guide to SWT and JFace - Robert Harris, Rob Warner
網絡資源
http://www.eclipse.org/swt/
SWT新聞組
Getting Started with Eclipse and the SWT
SWT Javadoc
術語表(Glossary)
native ---- 原生
widget ---- 部件
SWT是一套高效,跨平臺的原生窗口部件庫,使得Java程序能夠使用操作系統提供的原生用戶界面,支持大部分操作系統,具體的請看這里。
Erich Gamma: 我們曾經用Swing/AWT開發過一個IDE,VisualAge/MicroEdition。 完成后,我們的感覺很好,但是早期的用戶感覺并不好,他們抱怨的主要一個是性能問題,另外一個是程序一些與Windows不相符的特性(non-native)。一部分性能問題是我們的錯誤,一部分要歸咎于Swing。通過我們的努力和其他一些方法,我們相信性能問題可以不斷改善。讓我們擔憂的是Non-Native的特性。Swing是用模擬的方法實現的,Non-Native是Swing的天性。要解決Non-Native的問題,我們只能放棄Swing。正是這個原因,我們開發了SWT。
比較SWT和Swing
www.hacknot.info/hacknot/action/showEntry?eid=74
www-128.ibm.com/developerworks/grid/library/os-swingswt/
Ozgur Akan's Blog
Putting an end to the SWT/Swing nonsense
Is SWT better than Swing?
SWT & Swing probably both suck
Gosling on SWT
個人認為,拋開商業因素,SWT和Swing之爭主要是兩種方法之爭,模擬的(emulated)和原生的(native). Swing可以稱是"絕對的模擬", 我并不是指所有Swing的代碼是Java的,實際上Swing的JFrame也是一個原生的窗口。而是Swing的社區里非常排斥原生的代碼,我覺得有點過了。Swing是要以一己之力,通過Plugable Look And Feel來模擬所有它所支持的平臺的界面。SWT是以原生的代碼為主,模擬為輔。SWT也正在加強對其中模擬代碼的Plugable Look&Feel的功能的支持。一個很多Java高手不愿承認的事實,在操作系統領域Windows是越來越強,Suse被收購,Redhat被捐獻,蘋果電腦改稱蘋果,種種跡象都表明,未來桌面軟件是否成功,主要取決于Windows系統下的用戶的體驗。我的Java界面選擇是SWT,而不是Swing。
SWT的Platform Interface Layer : 比如Windows上調用Win API的Java原生代碼
User interface thread : 處理GUI的Thread
測試
在每個支持的平臺上都要測試SWT寫的程序,實際上Swing的程序也一樣需要測試,除非你的Swing程序在所有的平臺上都使用同一個Look&Feel.
custom widgets package 基于原生的SWT部件
API Package和非API Package(internal)
Label也可以有快捷鍵(Mnemonic)
以前只知道菜單可以有快捷鍵 , 通過 &File 指定 F 是 File 菜單的快捷鍵。原來 Label 也是可以有快捷鍵的,用同樣的方法指定。當用戶按 Alt+ 快捷鍵時, Label 的下一個控件將獲得輸入焦點。下一個控件一般是指子控件列表里位于 Label 后面的那個控件。如果 Label 是子控件列表里的最后一個,那么 SWT 會調用一個系統的算法尋找下一個控件 . 
Radio Buttons
當Radio Buttons在SWT.NO_RADIO_GROUP的容器中時,Radio Buttons的行為就類似Check Buttons. 但是是Radio Buttons的樣子, 所以要謹慎用SWT.NO_RADIO_GROUP. 如果Radio Buttons或者Radio Menus在RADIO_GROUP的容器中時, 選擇一個Button,原來被選的Button會變成不被選中, 這時會有兩個SWT.Selection的事件分別被發送到這兩個Button。Radio Menus完全和Radio Button類似。一個典型的Radio Buttons的Listener
Listener listener = new Listener() {
public void handleEvent(Event event) {
Button button = (Button) event.widget;
if ( ! button.getSelection()) return ;
事件處理代碼
}
};
Text SWT指定范圍的方式和Java的習慣不一樣, Text.getText(int start, int end)包括index為end的字符, 而String.substring(int start, int end)不包括index為end的字符。這個挺糟糕的。可惜按SWT Team的說法他們發現這個錯誤太晚了,可能是因為SWT Team的人都是Smalltalk的背景吧。
Text.setSelection(start, end)中start,end的值可以是0到N, N為Text的長度,也就是說提供N+1種的選擇可能性。(0,0)表示什么都不選, (0, N)表示全部選中. setSelection(start) = setSelection(start, start). 加上getText的約定,這是很容易出錯的, 比如
text.setText("Hello world!"), 要選中Hello這個單詞, 要用text.setSelection(0, "Hello".length()), 而不是"Hello".length()-1.
SWT.Modify和SWT.Verify的區別: Verify事件是在字符別插入之前,而Modify是在字符被插入之后。Verify的event.doit=false將取消字符插入.
Decorations(不是Decoration)
是窗口內的一個窗口,可以改變大小,移動。

TabFolder
controls是加在TabFolder上,而不是TabItem上。Item是Widget,但不是Control。
ToolBar
是shell的一個子控件,和Label,button沒有區別,也需要Layout來管理。
DROP_DOWN的ToolItem只是提供了界面,下拉菜單要自個做,判斷Selection事件的event.detail==SWT.ARROW可以區分按了哪里.
CoolBar
可以包含其他控件,可以移動
Sash 是一個可以被拽動的分隔控件. 使用Sash的Selection事件改變控件位置和