SWT Display 用法

Display处理消息机制是和底层平台相关的,以windwos平台为例


所有的系统消息首先被display截取,然后他会根据传入的hwnd,定位到相应的Control
,交由Control来处理。Control处理消息的时候,会根据消息的类型,转化为SWTEventObject对象,然后通知消息监听者。这样一来底层消息就转化为SWT的事件对象了。

例如:鼠标按下事件,首先操作系统会发送一个WM_LBUTTONDOWN的消息,经由Display转交Control处理,最后转化为MouseEvent。

如果你想自定义消息,需要调用操作系统底层的API函数,来创建用户自定义消息。
即便是这样,你的自定义消息,SWT是不认识的,也不会转化为相应的SWTEventObject的对象。要想处理自定义消息,你必须拦截Display的windowProc过程,来自己处理。但如此以来,已经严重的破坏了SWT的封装性,写出的代码也是平台相关的。

如果你想发送一个鼠标事件或键盘事件给一个控件,Display提供了一个便利的方法
post (Event event).
例如:Event event = new Event();
      event.type = SWT.MouseDown;
      event.x = 200;
      event.y = 100;
      event.button = 1;
      display.post(event);
这样只要位于坐标200,100位置下的控件,都会收到一条鼠标按下事件。这个控件甚至可以不是SWT的窗体控件,任何的Windows窗体都可以收到这个事件。 因为Display已经将Event转化成了系统的鼠标按下消息。

post()方法是有局限性的,它只会转发鼠标和键盘消息。最终都是调用的OS.SendInput()方法。

 Display:与操作系统沟通的桥梁

  我们在前面说过,每个swt程序在最开始都必须创建一个Display对象。Display对象起什么作用呢?它是swt与操作系统沟通的一座桥梁。它负责swt和操作系统之间的通信。它将swt/JFace的各种调用转化为系统的底层调用,控制操作系统为swt分配的资源。同时我们也可以通过Display对象得到操作系统的一些信息。

  Display是一个“幕后工作者”,它为swt/JFace提供支持,但是你并不能够从某个用户界面中看到它的影子。

  在前面的Hello,world!程序中,我们可以看到构建一个Display对象是和普通的Java对象一样通过构造函数实现的。它为实现图形界面准备了最基本的条件。而在程序结束时我们必须显式地调用dispose() 方法来释放程序运行中所获得的资源。一般来说,一个程序只需要一个Display对象,当然没有人禁止你创建多个Display对象。但是在swt的javadoc中,我们可以看到关于这个问题一些描述:

“Applications which are built with SWT will almost always require only a single display. In particular, some platforms which SWT supports will not allow more than one active display. In other Words, some platforms do not support creating a new display if one already exists that has not been sent the dispose() message.”

  Display有着众多的方法,我们不可能一一介绍。在这里只挑选几个可能会比较常用的作一些简单介绍。

  ·setData()和getData():这一对函数允许我们为Display对象设定一些数据,setData()的参数中key和value类似于我们在使用Map对象中key和value的含义。

  ·getShells()得到关联到该Display对象的所有没有dispose的Shell对象

  ·getCurrent()得到与用户交互的当前线程

  ·readAndDispatch()得到事件并且调用对应的监听器进行处理
 
  ·sleep()等待事件发生

 

你可能感兴趣的:(SWT Display 用法)