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

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