定制 SWT/RCP 界面
简介:?本文介绍如何利用 SWT/RCP 中的功能,编写漂亮的 SWT/RCP 界面。文章开始介绍了 ECLIPSE 中关于图形的一些基本知识,通过定义图形来设置 SWT/RCP 界面的外形。然后介绍如何通过图片来定义图形外形,通过图片来设置界面背景。最后介绍 RCP 中如何继承相关接口,定义界面外形和背景的。
生成两个矩形的函数如下:
生成圆形坐标数组的函数代码如下:
?
Control(控件)多边形外形只有在最近的 Eclipse 版本支持该功能。下面代码是通过另外一种非常规的手段来实现多边形小部件的,通过图片来显示小部件边界。程序首先定义一个 BUTTON 按钮,然后设置按钮的图片,让按钮大小约大于图片。为了只让图片显示,而不显示按钮,我们需要创建一个 Region,设置相应的偏移,使 Region 刚好覆盖要显示的图片。
?
图 1.5 说明了其中原因,如果要创建一个圆形多边形按钮,我们首先要定义个圆形部分的 Region,然后设置偏移 X1,Y1,再后设置 button 的 Region 为我们创建的 Region。这样 Button 显示给我们的就是一个圆形的 Button。而且只有该圆形区域,按钮点击才有响应。
值得注意的是,如果不用图片,圆形的 button 没法显示相应的边界,用户很难分辨圆形按钮和父窗口,因而用处不大。如果想创建一个像 Button 的多边形按钮,我们需要继承 Button,重载图形绘制部分,自己绘制 Region 的边界以显示一个真正的多边形按钮。
多边形控件只有在 Eclipse3.4 中才开始支持,有对方面感兴趣的朋友可以自己实现多边形控件,然后定义几个特例,比如说圆形,环形等。如果运气好的话,说不定这些实现可能被 Eclipse 采纳。
在 SWT 中,图像模型是 ImageData,它用来保存图像信息,如图像高度,宽度以及像素相关信息; 它不像 Image,是一个设备无关类。目前 SWT 支持 JPG, PNG, BMP 等图片格式。在这里我们遍历整个图片,获取每个像素值,如果像素值不为 0,表示该像素位于图片内。这些点组成的图形,就是图片的图像。
?
注意我们不能定制 WorkbenchPage 中的视图和编辑器的外形,但是视图和编辑器中定义的 Control 可以,如 Button, Label, Link, ProgressBar, Sash, Scale, Scrollable, Slider 等。这些 Control 外形定制的方法跟前面 SWT 中介绍的一样。
Workbench 和 WorkbenchWindows 都是些内部类,我们想定制多边形窗体,并不能直接修改他们。不过我们可以继承 Eclipse 暴露出一些回调函数组成的 Advisor 来重载这些 Eclipse 定义好的回调函数来设置一些相关的信息。当 Workbench 和 WorkbenchWindows 启动运行是,这些回调函数就会被调用到。Workbench 的 Advisor 是 WorkbenchAdvisor,这是一个应用级别的建议者,Workbench 启动和关闭是被调用到,用来设置透视图等信息,跟 UI 没有太大关系。WorkbenchWindows 的 Advisor 是 WorkbenchWindowsAdvisor,WorkbenchWindowsAdvisor 比 WorkbenchAdvisor 承担了更多的 UI 方面的角色。我们基本上可以使用该 Advisor 来设置每个工作台窗口的显示,如窗体风格、标题、工具栏、状态栏等。我们要实现多边形的 RCP 窗体,就是继承该类,重载其中的 postWindowCreate 和 createWindowContents 来实现的。
Eclipse 中的 OSGi 机制是通过 Equinox 来实现的。插件 org.eclipse.equinox.app 中定义了一个普通应用程序的启动的扩展点,Application 是它的一个扩展。下面是 RCP 启动的一个时序图:
Application 调用 PlatformUI.createAndRunWorkbench 来创建一个工作台 . 工作台 Workbench 调用 WorkbenchAdvisor 来设置相关信息,创建 WorkbenchWindow。 WorkbenchWindow 又通过 WorkbenchWindowAdvisor 来设置窗口的一些信息。重载 preWindowOpen 来设置窗体风格;重载 createWindowContents 来创建窗体内的部件,如菜单、工具栏、状态栏、WorkbenchPage 等;重载 postWindowCreate 来设置窗体大小、外形。
定制 RCP 窗体外形前,Shell 对象已经初始化,所以我们只能是在窗体创建后。设置 RCP 窗体外形跟前面的 SWT 程序一样简单,首先通过通过窗体配置参数获得当前窗体 Shell 的引用,然后定义一个外形 Region,使用这个外形设置窗体就成。
窗体中的部件的外形定制跟其他的 Control 一样,先创建图形,然后使用图形设置 Control 外形。需要注意的是我们需要定义好 Control 的位置,因为父子部件是一层层叠加的,最顶层的部件可能会覆盖其父部件的外形。
通过定制多边形外形,我们可以制作一个界面美观的媒体播放器 :
实例的部分代码如下:
?
这段代码是创建窗体上的控件,一个 video 播放 editor,一个播放按钮和一个退出按钮。video 播放 editor 是 Page 的一部分,而 Page 的外形通过图片来定义;一个播放按钮是通过一个文件对话框让用户来选择需要播放的 video 文件。
通过上面的介绍,我们可以看到,SWT/RCP 是一个非常优秀的应用界面 SDK,不光可以编写经典的窗体,还可以编写漂亮的多边形窗体及控件。希望读者通过本文的介绍,多使用 SWT/RCP 相关技术,开发出具有自己风格的应用程序。