一:SWT 对比Swing的两个重要区别:
1)SWT/JFace依靠JNI来管理操作系统的渲染而不是由其自己来实施。
——对比Swing:
Swing的渲染 为了确保界面在跨平台是能保持一致,Swing对用户界面的每一个细节的渲染进行完全控制,也就是Java虚拟机指令到其组件的每一个象素和具体行为。虽然Swing也同底层平台保持通信,但是却不使用操作系统任何已内置的对象,即其白手起家,创建每一个对象。因为这些组件都运行于较高层次,它们被引喻为轻量级组件。这些组件在任何Java支持的平台上表现一致。
2)SWT/JFace的资源管理,不依赖于垃圾自动回收机制
——对比Swing:
对操作系统资源使用AGC是困难的,由于Swing在高端层次建立了其轻量级的组件,所以这还不成为一个问题。然而,如果在低端层次如SWT小部件同样去使用自动回收机制,那么在跨平台环境下错误的易发性和不确定性将会是个灾难。
二:JFace适配器:
阅读器 分离小部件的外观和信息
动作和实施 简化和组织事件处理进程
图案和字体注册 管理和分配/释放图案、字体资源
对话框和向导 扩展SWT对话框和用户互动的能力
三:基本容器归纳
重要的对象是Display,它在后台与操作系统保持着通信。这一通信确保你的SWT/JFace应用程序可以使用原生组件并处理事件。虽然Display自己没有任何外观,但其它的小部件都需要它的运作才得以成形。 SWT提供一个Shell类作为大一统的GUI应用程序和对话框的容器。Shell形成GUI的父窗口并为子小部件们和Display提供通信。使用风格值,你可以定制Shell的外观和行为。 与上面相对照的,JFace的应用程序使用ApplicationWindow作为它们的主容器。不同于Shell, ApplicationWindow没有内置的form。这意味着你可以随心所欲地指定你的顶级窗口;另外,这些对象提供的方法可以轻易与其他特性集成,如菜单、工具条或是状态栏等。
四:理解Widget类
Widget是所有在SWT和JFace中所有显示信息以及和用户互动的类的超类。然而不仅它是一个抽象类,另外Eclipse.org组织也强烈反对由其产生子类,因为其间牵涉太多的复杂性。因此,你不能从Widget类继承或是在你的代码中直接使用它。事实上,这个类的重要性是在于它把所有的小部件统合在一个结构下。
五:Control类
在Control类中的对象在操作系统中有一个直接的对应物,你可以通过类里的句柄域加以接近它。然而在Control类之外,SWT还提供了不少的小部件。
六:JFace中的事件处理
一个监听器接口能够为不同的control提供相同的事件处理,但是其使用依赖于发起这一事件的组件。接收鼠标事件的监听器不能用以菜单栏的选择。即便是非类型化的事件也只是在程序指定了哪一类的control来触发事件后才有用。 但是当你处理复杂的用户界面时,将事件处理能力从产生事件的GUI组件中分离出来的做法就很有帮助了。
Jface用其Action和ActionContributionsItem类提供了这样的分离。一个ActionContributionItem 组合了一个GUI组件的功能和添附于其上的监听器类。当用户与其互动时,将会触发与其相联系的动作类,以负责处理该事件。虽然这看上去和SWT的监听器/事件模型相似,但是这些类却更加抽象,易于使用,范围相对专一。
如果存在这样一组套件,它仅关注于平时经常使用的小部件和事件,并将这一切的使用尽可能作简化,那将极大地简化事件编程。JFace的事件处理结构所做的正是如此:它的目标就是为了时事件处理更加简介明了,它允许程序员仅使用少量的几行代码来接收和处理通常的事件。为了达成这一目标,JFace做了如下三个假设:
1)用户的动作将限于按钮、工具条和菜单
2)每一个组件将仅有一个事件与之相联系
3)每一个事件仅有一个事件处理器
JFace中的一个Action可以简单地理解成一个命令。在JFace里面,Action可以关联到菜单,工具条,以及按钮(也就是Button)。
七:事件处理概述:
很明显的,对于复杂的图形界面必须综合使用两种事件处理机制。虽然JFace可以提供菜单、工具条和按钮的快速编程,但是我们还需要SWT来处理键盘事件以及和Shell、表等小部件相关的事件。另外,JFace类也无法区分一个鼠标右击和左击事件。因此,对于一个GUI变成人员事实上是在寻找一条综合使用两个套件以最少代码获取最大功能的途径。