gr8vyguy@Blogjava

SWT学习杂记

推荐书籍

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 会调用一个系统的算法寻找下一个控件 . star

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)

是窗口内的一个窗口,可以改变大小,移动。

decorations.jpg


TabFolder
controls是加在TabFolder上,而不是TabItem上。Item是Widget,但不是Control。

ToolBar
是shell的一个子控件,和Label,button没有区别,也需要Layout来管理。
DROP_DOWN的ToolItem只是提供了界面,下拉菜单要自个做,判断Selection事件的event.detail==SWT.ARROW可以区分按了哪里.

CoolBar
可以包含其他控件,可以移动

Sash 是一个可以被拽动的分隔控件. 使用Sash的Selection事件改变控件位置和

posted on 2007-02-24 15:21 gr8vyguy 阅读(2493) 评论(7)  编辑  收藏 所属分类: Java

评论

# re: SWT学习杂记 2007-03-03 11:51 催月泪

controls(控件)是容器可以容纳部件,而widget(部件)只能建在control上,是不是这个意思?  回复  更多评论   

# re: SWT学习杂记 2007-03-14 22:56 喜来乐哈哈

@催月泪
不是的, SWT中Control是指需要操作系统资源的Widget,容器是Composite类, Widget是所有SWT对象的父类。  回复  更多评论   

# re: SWT学习杂记 2007-03-17 06:32 BeanSoft

介绍的很不错. 发现 TabItem 无法动态显示/隐藏, 有点头大....也许有别的办法实现吧.  回复  更多评论   

# re: SWT学习杂记 2007-03-17 12:03 喜来乐哈哈

@BeanSoft
用TabItem.dispose() 隐藏, 它并不毁坏和TabItem相关的Control。显示的话就得重新new一个TabItem到正确的位置,再置上原先的Control。 有点繁琐, 我不知道其他的法子了。可以写成一个类封装这个功能。  回复  更多评论   

# re: SWT学习杂记 2007-03-23 02:53 BeanSoft

是呀, 很是纳闷没有提供 setVisible 的方法. 按说 item 也是组件, 为啥就不能被隐藏呢?  回复  更多评论   

# re: SWT学习杂记 2007-03-23 02:59 喜来乐哈哈

@BeanSoft
是因为Item是从Widget继承的,而不是从Control继承的。
  回复  更多评论   

# re: SWT学习杂记 2007-08-21 03:13 CloudiDust

"在操作系统领域Windows是越来越强,Suse被收购,Redhat被捐献,苹果电脑改称苹果,种种迹象都表明,未来桌面软件是否成功,主要取决于Windows系统下的用户的体验。"

这是偏颇的说法~~~

Suse被收购是因为Novell看到了Linux的巨大潜力,事实上suse也发展得非常好.

RedHat也没有被捐献,只是分为了社区项目Fedora和企业项目RHEL,目前仍然是Linux发行版的一把手,似乎也准备回到桌面领域.

更不要说上升强劲的Ubuntu了~~~~~

以及其他发行版~~~~~

  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2007年2月>
28293031123
45678910
11121314151617
18192021222324
25262728123
45678910

导航

统计

公告

  • 转载请注明出处.
  • msn: gr8vyguy at live.com
  • 常用链接

    留言簿(9)

    随笔分类(68)

    随笔档案(80)

    文章分类(1)

    My Open Source Projects

    搜索

    积分与排名

    最新评论