推荐书籍
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事件改变控件位置和