SWT 事件综述
SWT作为UI开发,那其事件是非常重要的,下面就针对事件进行些讲解:
SWT的事件模型,类似与Observer模式,在Widget类中持有EventTable EventTable对象主要用来保存事件的监听者(Listener)其有2个成员变量,一个是types和listeners分别存放事件的类型和对应的Listener,它提供了,hook/unhook方法来添加删除Listener,用sendEvent来通知事件发生。
那SWT是怎么知道什么时候该出发相应的事件的呢:
其实一切都是基于SWT中Display,这个与操作系统有直接关系的对象,首先在Display中init()方法中调用Native的方法注册window callback。在app打开的时候,Display就会一直运行readAndDispatch方法:
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
在这个方法中我们可以发现,Display 不断的将系统发来的消息进行Translate和Dispatch,最后确定到某个控件的某个事件,从而触发这个事件的listener,简单点说就是:用户鼠标点了下,Display接受到系统的MSG,将这个MSG进行解析和调用,根据MSG信息从Display controlTable成员变量确定是哪个控件和什么事件的类型,从而出发该控件的指定事件。
下面我们就来介绍下SWT 中比较常用的事件:
下面再附上一个例子:
- StackLayout sl=new StackLayout();
- shell.setLayout(sl);
- for(int i=0;i<5;i++){
- Button b=new Button(shell,SWT.PUSH);
- b.setText("button"+i);
- b.setData(i);
- if(i==0){
- sl.topControl=b;
- }
- b.addSelectionListener(new SelectionListener() {
- @Override
- public void widgetSelected(SelectionEvent e) {
- // TODO Auto-generated method stub
- for(Control c:shell.getChildren()){
- int index=(int) b.getData();
- if(index<4){
- index++;
- if(index==(int)c.getData()){
- sl.topControl=c;
- shell.layout();
- break;
- }
- }else{
- if(0==(int)c.getData()){
- sl.topControl=c;
- shell.layout();
- break;
- }
- }
- }
- }
- @Override
- public void widgetDefaultSelected(SelectionEvent e) {
- // TODO Auto-generated method stub
- }
- });
- }
我们也可以用addListener(type,new Listener());SWT类中有相应的事件类型
参考资料:
http://wenku.baidu.com/link?url=acJ1Ykha5StwZbKX3uxtSKGui2IIb8MheJv-bcq3cku3xCpw3im-d_JMcPdfcKRDj1s-AYXiCq53F-0Y5ad429b5F5XZ9LIkitHwbCnC-f_###