SWT Display与Shell

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()等待事件发生

 

Shell 窗口:

一个Shell对象就是一个窗口。你可以在上面放置各种部件创建丰富的图形界面。

  我们都知道窗口有很多种,比如窗口有可以调整大小的,有不可以的,有的没有最大化最小化按钮。这些窗体的特征在swt中被成为风格(style)。一个窗体的风格可以用一个整数进行定义。这些风格的定义在org.eclipse.swt.SWT中。
 
  Shell对象可用的风格包括:BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE , PLICATION_MODAL, MODELESS, PRIMARY_MODAL,S YSTEM_MODAL

  这些风格我们不作一一介绍,你可以从他们字面意义看出一些含义来,当然也可以参考对应的javadoc。

  我们可以在一个Shell的构造函数中定义它的风格,比如在前面的Hello,world!程序中,我们可以这样定义Shell。

Shell shell = new Shell(display,SWT.CLOSE | SWT.SYSTEM_MODEL);
  最后得到的窗体没有最大化和最小化按钮,并且大小是固定不变的。

  因为swt运行于各种平台之上,而这些平台上的窗口管理器千差万别,所以所有这些风格都不是肯定可以实现的。在swt的javadoc中,这被称为暗示(hints)。

  Shell对象的方法大都和GUI有关,比如setEnabled()设定了窗体是否能够和用户进行交互,setVisble()设定了窗体是否可见,setActive()将窗体设为当前的活动窗口。

  我们可以用open()方法打开一个窗体,close()方法关闭一个窗体。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值