梁某人

发展才是硬道理

导航

SWT部件概述

SWT部件概述

Translated By xiaotaoliang 04.12

SWT包含了丰富的特性,但关于系统核心的基本知识 部件、布局以及事件机制,就是开发有用、强壮的应用程序所需要知道的所有东西。

部件应用程序结构

使用工作平台扩展开发用户界面元素时,平台会处理SWT的启动机制。如果你要在工作平台之外从头开始写独立SWT应用的话,得更深入地了解SWT的应用程序结构。

典型的独立的SWT应用具备以下结构:

  • 创建一个Display对象,这代表了一个“SWT会话”。
  • 创建一个或多个Shell对象,这将作为应用的主窗口(可以有多个)。
  • 创建shell里需要的其他的部件。
  • 初始化部件的尺寸和其他必需的状态。为需要处理的部件事件注册监听器(listener)
  • 打开shell窗口。
  • 运行事件分发循环,直到遇到一个退出条件:典型场景是用户关闭主shell窗口。
  • 销毁display对象。

以下代码片断出自应用程序: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 ();
   }

Display对象

Display对象代表了SWT与潜在的平台图形用户界面系统之间的关联。Display对象(或集合)主要用于管理平台事件循环并控制用户界面线程与其他线程之间的通讯(另具文详细描述客户线程控制)。

对于大部分的应用,你可以遵循以上的开发模式。必须在创建任何窗口之前创建Display对象,而且当Shell关闭以后,必须销毁Display对象。对于display对象,不必考虑太多,除非你要设计一个多线程应用程序。

Shell对象

一个Shell对象是由操作系统平台的窗口管理器管理的“窗口”。顶层的shell对象创建为display对象的子对象,用户使用应用程序时,会对这些窗口进行移动、改变大小、最小化、最大化等操作。第二种shell对象被创建为其他shell的子对象,典型地,这些窗口被用于作为对话框窗口或者只作为透明窗口存在于其他窗口的上下文中。

部件的父子关系

所有不是顶层shell的部件都必须有一个父对象。顶层的shell没有父,但被创建为与一个特定的Display对象相关联。可以通过getDisplay()方法获取这个display对象。其他所有的部件被创建为顶层shell对象(或集合)的层级结构(直接或间接)。

“复合部件”是具有子对象的部件。

可以把一个应用程序窗口看作一棵以shell对象作为根的部件树,或继承结构。视应用的复杂度,shell可以有单一的子部件,若干子部件,或具有子对象集合的复合部件的嵌套层次。

部件的生命周期

当应用程序创建一个部件的时候,SWT会立即为此创建相应的平台内部部件,因此代码不必考虑是否存在相应的平台部件并因而作相应的代码处理。SWT允许大部分的部件数据保留在平台层,而不是在工具箱中重复一次,这意味着在工具箱的概念中,部件的生命周期必须遵循内部的图形用户界面系统的规则。

部件的创建

大部分的图形用户界面平台需要你在创建部件的时候指定一个父对象。既然SWT会在你创建一个工具箱部件的同时立即创建一个平台部件,因此在部件的构造函数中必须指定父部件。

样式位域

在操作系统中,某些部件的样式必须在部件创建的时候就设置好,而且不能随后修改之。譬如,一个list部件可以是单选或多选,有或没有滚动条。

这些属性,称为“样式”,必须在构造函数中设置。所有的部件构造函数都有一个int类型的参数,指明部件所需样式的按位或值(OR)。在某些情形中,一种特定的样式被认为是一种提示,表明这种样式不是在所有平台中都有效,但会在不支持它的平台中被安全地忽略掉。

样式常量在SWT类中定义为public static字段。详见SWTAPI参考。

资源释放

SWT下,操作系统平台需要显式分配和释放系统资源。为了与SWT的设计思想一致,即在工具箱中映射平台应用程序结构,SWT需要开发者显式释放已分配的系统资源。使用Widget.dispose()方法来释放与特定工具箱对象相关联的系统资源。

通常的规则即:谁创建,谁负责释放。以下是一些进一步解释这种设计思想的基础规则:

  • 如果你用构造函数创建了部件或图形对象,就必须在用完这些对象以后手工销毁之。
  • 如果你不是使用构造函数取得部件或图形对象,就不能手工销毁他们,因为你没有为其分配资源。
  • 如果你把部件或图形对象的引用传给其他对象,要小心不要让他们还在被使用的时候被释放掉。(类似的规则也在“图形使用的插件模式”这篇文章中描述)
  • 当用户关闭一个Shell对象的时候,Shell对象以及其所有的子部件将会被递归地销毁。在这种情况下,你不必手工销毁每个部件,但是,你必须手工释放与这些部件相关联的任何图像资源。
  • 在一个部件的生命周期中创建的图形对象,必须在部件被销毁的同时被销毁。可以为你的部件注册一个“销毁监听器”,让监听器在接收到销毁事件的时候释放图像对象。
  • 这些规则中有一个例外:简单的数据对象,比如RectanglePoint,不使用操作系统资源,因此他们没有dispose()方法,你也不必释放他们。如果存疑,请针对特定的类查看javadoc
  • 在“管理操作资源”这个文档中会有对这个主题的进一步描述。

 

posted on 2004-12-14 22:55  涛仔28  阅读(776)  评论(0编辑  收藏  举报