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 中比较常用的事件:

SWT 事件综述_第1张图片

SWT 事件综述_第2张图片

下面再附上一个例子:

 

  1. StackLayout sl=new StackLayout();  
  2. shell.setLayout(sl);  
  3. for(int i=0;i<5;i++){  
  4.     Button b=new Button(shell,SWT.PUSH);  
  5.     b.setText("button"+i);  
  6.     b.setData(i);  
  7.     if(i==0){  
  8.         sl.topControl=b;  
  9.     }  
  10.     b.addSelectionListener(new SelectionListener() {  
  11.                   
  12.         @Override  
  13.         public void widgetSelected(SelectionEvent e) {  
  14.             // TODO Auto-generated method stub  
  15.                       
  16.             for(Control c:shell.getChildren()){  
  17.                 int index=(int) b.getData();  
  18.                 if(index<4){  
  19.                     index++;  
  20.                     if(index==(int)c.getData()){  
  21.                         sl.topControl=c;  
  22.                         shell.layout();  
  23.                         break;  
  24.                     }  
  25.                 }else{  
  26.                     if(0==(int)c.getData()){  
  27.                         sl.topControl=c;  
  28.                         shell.layout();  
  29.                         break;  
  30.                     }  
  31.                 }  
  32.             }  
  33.         }  
  34.                   
  35.         @Override  
  36.         public void widgetDefaultSelected(SelectionEvent e) {  
  37.             // TODO Auto-generated method stub  
  38.                       
  39.         }  
  40.     });  
  41. }  

我们也可以用addListener(type,new Listener());SWT类中有相应的事件类型

参考资料:

http://wenku.baidu.com/link?url=acJ1Ykha5StwZbKX3uxtSKGui2IIb8MheJv-bcq3cku3xCpw3im-d_JMcPdfcKRDj1s-AYXiCq53F-0Y5ad429b5F5XZ9LIkitHwbCnC-f_###

你可能感兴趣的:(event,SWT)