从
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
实体。