SWT Display用法

转载 2018年04月17日 10:48:25

转载:https://blog.csdn.net/hangke/article/details/184201

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 用法

Display处理消息机制是和底层平台相关的,以windwos平台为例所有的系统消息首先被display截取,然后他会根据传入的hwnd,定位到相应的Control,交由Control来处理。Cont...
  • hangke
  • hangke
  • 2007-10-24 17:27:00
  • 2784

SWT中的Display 对象和 Shell对象

我们书写swt程序的步骤,这些步骤是: 1.      创建一个Display对象 2.      创建一个或者多个Shell对象,你可以认为Shell代表了程序的窗口。 3.   ...
  • orange2211
  • orange2211
  • 2015-03-26 10:02:02
  • 1276

Java界面 SWT 开发基础——Display and Shell

Display 基本概述与Shell 类的基本结构 本次实验主要包含创建一个空白的 Display,并在其中建立 Shell 的父类,Shell 中设置按钮,通过按钮创造子窗口。 此外在父窗口设置中加...
  • zstu_wangrui
  • zstu_wangrui
  • 2014-03-05 11:47:05
  • 2694

SWT中定时器的一种特殊实现方式/SWT中线程互访时display.asyncExec/display.syncExec...程序死掉无响应的解决办法

最近在研究SWT,写了个小例子,涉及到线中的数据互访,如果在一个线程中的触发事性中再去访问另一个线程的数据,会把Invalid thread access的错误。 用SWT提供的display.as...
  • fm2005
  • fm2005
  • 2009-03-28 16:40:00
  • 4916

java SWT:Display.addFilter设置快捷键的例子-切换全屏

以前只知道org.eclipse.swt.widgets.Widget以及子类可以添加Listener。 今天才搞清楚: Display也addListener方法,而且还有优先级更高的addFi...
  • 10km
  • 10km
  • 2016-12-09 11:25:15
  • 959

SWT编程基础-Display和Shell

Display和Shell
  • jianggujin
  • jianggujin
  • 2016-04-30 14:53:10
  • 1825

Display和Shell在SWT中的作用

在SWT中要想创建一个窗口,至少要用到两个类:Display和Shell。Display负责处理所有SWT窗口小部件和操作系统之间的交互,比如我们可以通过Display的方法来查询操作系统:哪个控件获...
  • landca
  • landca
  • 2010-09-21 13:48:00
  • 649

SWT:保存图像

SWT:保存图像主要涉及一个org.eclipse.swt.graphics.ImageLoader类eg:ImageLoader loader = new ImageLoader();loader....
  • cuser_online
  • cuser_online
  • 2011-06-02 22:41:00
  • 956

SWT组件的生命周期(续一个简单的SWT程序实例及详解)

上一篇详细介绍了一个SWT实例,这一篇接下来介绍SWT组件的生命周期本篇译自《 Eclipse.Building.Commercial.Quality.Plug.ins.2nd.Edition 》第四...
  • hotzz9
  • hotzz9
  • 2006-07-04 18:57:00
  • 1245
收藏助手
不良信息举报
您举报文章:SWT Display用法
举报原因:
原因补充:

(最多只允许输入30个字)