The Spark of Thinking

Focus on Eclipse Tools.

  语源科技BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  3 随笔 :: 27 文章 :: 4 评论 :: 0 Trackbacks

从 Hello, world! 开始了解 Display 和 Shell

在这一节中,我们从前面所列举出来的 Hello, world! 程序开始对 swt 进行一些初步的探索。所谓的初步是指,我们会介绍编写 swt 程序的基本思路,以及对两个重要的类 :Display 和 Shell 作一些介绍。

因为这一节和前一节是分成两个部分贴出来的,所以我仍然将 Hello, world! 的代码段在下面列出来:

 1 package swtjfacesample;
 2
 3 import org.eclipse.swt.SWT;
 4 import org.eclipse.swt.widgets.Display;
 5 import org.eclipse.swt.widgets.Shell;
 6 import org.eclipse.swt.widgets.Text;
 7
 8 public   class  HelloSwt  {
 9      /* *
10      * Hello,world!
11      * 
12      * @param args
13       */

14         public   static   void  main(String[] args)  {
15         Display display  =   new  Display();
16         Shell shell  =   new  Shell(display);
17         
18         Text helloText  =   new  Text(shell, SWT.CENTER);
19         helloText.setText( " Hello,World! " );
20         helloText.pack();
21         
22         shell.pack();
23         shell.open();
24
25          while  ( ! shell.isDisposed())  {
26              if  ( ! display.readAndDispatch())  {
27                 display.sleep();
28             }

29         }

30         display.dispose();
31
32     }

33 }


代码段 2

这段程序虽然很简单,但是它反映了我们书写 swt 程序的步骤,这些步骤是:

1.       创建一个 Display 对象

2.       创建一个或者多个 Shell 对象,你可以认为 Shell 代表了程序的窗口。

3.       在 Shell 内创建各种部件( widget )

4.       对各个部件进行初始化(外观,状态等),同时为各种部件的事件创建监听器( listener )

5.       调用 Shell 对象的 open() 方法以显示窗体

6.       各种事件进行监听并处理,直到程序发出退出消息

7.       调用 Display 对象的 dispose() 方法以结束程序。

 

 

 

在 Hello,world! 程序中,为了让程序更加简单,我们没有创建事件监听器,在以后的内容中会进行专门介绍。

现在让我们稍微深入一些,看一下这些 Display,Shell 有什么作用以至于我们每个程序都必须有它们存在。

Display: 与操作系统沟通的桥梁

我们在前面说过,每个 swt 程序在最开始都必须创建一个 Display 对象。 Display 对象起什么作用呢?它是 swt 与操作系统沟通的一座桥梁。它负责 swt 和操作系统之间的通信。它将 swt/JFace 的各种调用转化为系统的底层调用,控制操作系统为 swt 分配的资源。同时我们也可以通过 Display 对象得到操作系统的一些信息。

Display 是一个 “ 幕后工作者 ” ,它为 swt/JFace 提供支持,但是你并不能够从某个用户界面中看到它的影子。

在前面的 Hello,world! 程序中,我们可以看到构建一个 Display 对象是和普通的 Java 对象一样通过构造函数实现的。它为实现图形界面准备了最基本的条件。而在程序结束时我们必须显式地调用 dispose() 方法来释放程序运行中所获得的资源。一般来说,一个程序只需要一个 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 有着众多的方法,我们不可能一一介绍。在这里只挑选几个可能会比较常用的作一些简单介绍。

l          setData() 和 getData() :这一对函数允许我们为 Display 对象设定一些数据, setData() 的参数中 key 和 value 类似于我们在使用 Map 对象中 key 和 value 的含义。

l          getShells() 得到关联到该 Display 对象的所有没有 dispose 的 Shell 对象

l          getCurrent() 得到与用户交互的当前线程

l          readAndDispatch() 得到事件并且调用对应的监听器进行处理

l          sleep() 等待事件发生

Shell: 窗口

一个 Shell 对象就是一个窗口。你可以在上面放置各种部件创建丰富的图形界面。

我们都知道窗口有很多种,比如窗口有可以调整大小的,有不可以的,有的没有最大化最小化按钮。这些窗体的特征在 swt 中被成为风格( style )。一个窗体的风格可以用一个整数进行定义。这些风格的定义在 org.eclipse.swt.SWT 中。

Shell 对象可用的风格包括: BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE , PLICATION_MODAL, MODELESS, PRIMARY_MODAL, S YSTEM_MODAL

这些风格我们不作一一介绍,你可以从他们字面意义看出一些含义来,当然也可以参考对应的 javadoc 。

我们可以在一个 Shell 的构造函数中定义它的风格,比如在前面的 Hello,world! 程序中,我们可以这样定义 Shell 。  

Shell shell  =   new  Shell(display,SWT.CLOSE  |  SWT.SYSTEM_MODAL);

   

最后得到的窗体没有最大化和最小化按钮,并且大小是固定不变的。

因为 swt 运行于各种平台之上,而这些平台上的窗口管理器千差万别,所以所有这些风格都不是肯定可以实现的。在 swt 的 javadoc 中,这被称为暗示( hints )。

Shell 对象的方法大都和 GUI 有关,比如 setEnabled() 设定了窗体是否能够和用户进行交互, setVisble() 设定了窗体是否可见, setActive() 将窗体设为当前的活动窗口。

我们可以用 open() 方法打开一个窗体, close() 方法关闭一个窗体。

小结

本节讨论了 Display 和 Shell 的一些概念,这是我们以后进一步了解 swt 的基础。在下一节中,我将介绍各种部件( widget )的用法,所谓部件,是指文本框,标签等 UI 实体。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=368099

posted on 2006-07-20 17:32 The Spark of Thinking 阅读(271) 评论(0)  编辑  收藏 所属分类: SWT/JFace