SWT 包含许多功能部件,但是系统的核心的基础知识 — 小窗口、布局和事件 — 都是实现有用而且功能强大的应用程序所需要的。
当使用平台工作台扩展来添加 UI 元素时, 用于启动 SWT 的机制是由工作台来处理的。
如果您正在根据暂存区(在工作台外部)来编写 SWT 应用程序, 则必须更多地了解 SWT 的应用程序结构。
典型的独立 SWT 应用程序具有下列结构:
创建显示,它表示 SWT 会话。
创建一个或多个 外壳程序,它充当应用程序的主窗口。
创建外壳程序内部需要的任何其他小窗口。
初始化小窗口的大小和其他必需的状态。为需要处理的小窗口事件注册侦听器。
打开外壳程序窗口。
运行事件调度循环,直到发生退出情况为止(通常是在用户关闭主外壳程序窗口的情况下)。
除掉显示。
以下代码片段改编自 org.eclipse.swt.examples.helloworld.HelloWorld2 应用程序。由于该应用程序只显示字符串“Hello World”,因此不需要向任何小窗口事件注册。
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
label.setText ("Hello_world");
label.setBounds (shell.getClientArea ());
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
显示表示 SWT 与基础平台的 GUI 系统之间的连接。显示主要用来管理平台事件循环和控制 UI 线程与其他线程之间的通信。(有关 UI 线程问题的完整讨论,参见客户机的线程问题。)
对于大多数应用程序,可以遵循以上所使用的模式。在创建任何窗口之前必须创建显示,并且当关闭外壳程序时,您必须除掉显示。除非您正在设计多线程应用程序,否则,不需要太过考虑显示。
外壳程序是由 OS 平台窗口管理器管理的一个“窗口”。顶级外壳程序是作为显示的子代创建的那些外壳程序。这些窗口是在用户使用应用程序时移动、调整大小、最小化和最大化的窗口。辅助外壳程序就是作为另一个外壳程序的子代创建的那些外壳程序。这些窗口通常用作只存在于另一个窗口的上下文中的对话框窗口或其他瞬时窗口。
不是顶级外壳程序的所有小窗口都具有父代。顶级外壳程序没有父代,但是,它们都是通过与特定显示相关联而创建的。可以使用 getDisplay() 来访问此显示。所有其他小窗口都是作为顶级外壳程序的子代(直接或间接)来创建的。
组合体小窗口是可以具有子代的小窗口。
当看到应用程序窗口时,可以将它看作小窗口树,或者看作层次结构,其根目录就是外壳程序。根据应用程序的复杂性,可以具有外壳程序的单个子代、几个子代或者具有子代的组合体的嵌套层。
当应用程序创建小窗口时,SWT 将立即创建基础平台小窗口。因此,不再需要根据基础 OS 小窗口是否存在而执行不同操作的代码。它还允许将小窗口的大部分数据保存在平台层而不是在工具箱中复制。这就意味着工具箱的小窗口有效期的概念必须符合基础 GUI 系统的规则。
创建小窗口时,大多数 GUI 平台都要求您指定父代。由于只要您创建了工具箱小窗口,SWT 就会创建平台小窗口, 因此,必须在构造器中为小窗口指定父代小窗口。
某些小窗口特性必须在创建小窗口时由 OS 来设置,并且以后不能更改。例如,列表可以是单个或多个选择,并且可以具有滚动条也可以没有滚动条。
必须在构造器中设置这些特性(称为样式)。所有小窗口构造器都采用 int 自变量, 该自变量指定所有期望样式的位宽 OR。在某些情况下,认为特定样式是一种提示, 这意味着它可能在所有平台上都不可用,但是在不支持它的平台上将适当地忽略它。
样式常量位于 SWT 类中,并作为 public static 字段。SWT 的“API 参考”中包含了每个小窗口类的可应用常量的列表。
在 SWT 下面的 OS 平台需要显式地分配和释放 OS 资源。为了配合反映小窗口工具箱中的平台应用程序结构的 SWT 设计原理,SWT 要求您显式地释放已经分配的任何 OS 资源。在 SWT 中,dispose() 方法用来释放与特定工具箱对象相关联的资源。
经验法则是,如果您创建对象,则您必须除掉它。以下进一步说明此原理的特定规则:
当使用构造器来创建小窗口或图形对象时, 使用完时必须用手工来除掉它。
如果没有使用构造器就获取小窗口或图形对象, 则一定不能用手工来除掉它,因为您未分配它。
如果将对小窗口或图形对象的引用传送至另一个对象, 则一定要小心,仍在使用它时一定不要除掉它。(实际上,我们很早就在用于使用图像的插件模式中了解了此规则。)
当用户关闭外壳程序时, 将递归地处理外壳程序及其所有子代小窗口。在此情况下,不需要除掉小窗口本身。然而,必须释放与那些小窗口一起分配的所有图形资源。
如果创建图形对象以便在其中一个小窗口的有效期内使用它, 则在除掉小窗口时必须除掉图形对象。这可以通过向小窗口注册处理侦听器,并在接收到处理事件时释放图形对象来实现。
这些规则有一个例外。简单的数据对象(例如 矩形和点)不使用操作系统资源。它们没有 dispose() 方法,您也不需要释放它们。如果有疑问,则检查特定类的 javadoc。