Display对象代表了底层图形系统的实现,它是SWT与操作系统沟通的一座桥梁,它负责SWT和操作系统之间的通信,将SWT/JFace的各种调用转化为系统的底层调用,控制操作系统为SWT分配的资源,同时我们也可以通过Display对象得到操作系统的一些信息。其中,Display的主要任务是事件处理,它负责从操作系统的事件队列中读取事件,传递给RCP的事件监听器以便完成具体的任务。Display是一个“幕后工作者”,它为SWT/JFace提供支持,但是你并不能够从某个用户界面中看到它的影子,所以,需要注意的是,Display不代表应用程序窗口的任何可视控件,在应用程序主窗口打开之前,Display是不可获得的。应用程序主窗口打开之后,才可以通过一个被称作Shell的对象获取它。
其获取方法有:Display display = new Display();
或者Display display = Display.getCurrent();
一般来说,一个程序只需要一个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的常用方法:
1)setData()和getData():这一对函数允许我们为Display对象设定一些数据,setData()的参数中key和value类似于我们在使用Map对象中key和value的含义。
2)getShells()得到关联到该Display对象的所有没有dispose的Shell对象
3)getCurrent()得到与用户交互的当前线程
4)readAndDispatch()得到事件并且调用对应的监听器进行处理
5)sleep()等待事件发生
Display. getCurrent()和Display. getDefault()方法的区别与使用:
比如你在线程A中生成了第一个Display实例,那么你在A线程中调用Display.getCurrent()方法得到的就是这个实例;如果你又生成了一个线程B,在线程B中调用Display.getCurrent()方法得到的就是null,因为在当前线程B中没有Display实例,线程B不是用户界面线程。而如果在线程B中调用Display.findDisplay(ThreadA),得到的就是线程A中的Display实例。
Display.getDefault()方法则是如果当前线程没有Display实例,则创建一个Display实例,如果有的话,则返回已创建的实例。
在某些操作系统上,只能创建一个Display实例,因此如果已经存在了一个用户界面线程,又在另外一个线程中调用Display.getCurrent()方法,会导致同时存在两个用户界面线程,因而出错。
二、 Shell
每一个窗口都有一个Shell对象。Shell对象代表了与用户交互的窗口框架,并处理与窗口关联的诸如移动、改变大小等常见行为。Shell对象的获得方法如下:
Display display = Display.getCurrent();
Shell shell = new Shell(display);
或者:Shell shell = Display.getCurrent().getActiveShell();
Shell对象的方法大都和GUI有关,比如setEnabled()设定了窗体是否能够和用户进行交互,setVisble()设定了窗体是否可见,setActive()将窗体设为当前的活动窗口。
三、 Workbench
Workbench是工作台,通俗的说就是代表用户界面的UI元素。工作台上有各种窗口、图标、按钮和其它各种控件,用户可以在工作台上做各种操作。获得工作台的方法如下:
IWorkbench workbench = PlatformUI.getWorkbench();
工作台有两个很有用的方法,即:
workbench.restart(),关闭应用程序并立即重新启动
Workbench.close(),正常关闭应用程序,等同于ActionFactory.QUIT_ACTION
四、 Advisor
Advisor是建议者,用户主界面宽度、高度、图标、菜单、工具栏、颜色、操作等等配置方案需要Advisor来提出“建议”。Eclipse提供了3中类型的Advisor,具体如下:
1、 WorkbenchAdvisor:
应用程序级别,Eclipse3.0开始引入的全新类。每个应用程序只要一个Workbench,而WorkbenchAdvisor负责该工作台生命周期管理,例如启动、关闭工作。WorkbenchAdvisor也负责该Workbench的异常处理,并负责向Workbench提供一些重要参数,例如可以指定该Workbench的初始透视图。
2、 WorkbenchWindowAdvisor:
窗口级别,每一个窗口都有一个WorkbenchWindowAdvisor实例。WorkbenchWindowAdvisor负责具体窗口生命周期的管理,例如状态栏、工具栏、菜单、窗口标题、窗口大小和各种控件等,也可以处理窗口的各种事件例程。
3、 ActionBarAdvisor:
窗口级别,每一个窗口都有一个ActionBarAdvisor实例。ActionBarAdvisor负责管理窗口的菜单栏、状态栏、工具栏的外观和行为。
五、 View和Editor
在Eclipse RCP应用程序中,用户主要通过视图(View)和编辑器(Editor)来与程序交互。视图是可以浮动的工作窗口,负责显示数据在某个层面的状态信息。编辑器也是一种工作窗口,提供对数据进行各种操作的交互能力。
六、 Perspective
Perspective被称之为透视图,RCP应用程序是透过透视图对窗口内容进行安排和布局的,应用程序都有一个默认的透视图,每个工作台窗口则可以包含一个或多个透视图,同时用户可以向透视图中添加其他UI界面元素。默认透视图是被设置为固定的,不能移动,而且没有标题栏。