书写
swt
程序的基本步骤如下:
1. 创建一个Display对象。
2. 创建一个或者多个Shell对象,你可以认为Shell代表了程序的窗口。
3. 在Shell内创建各种部件(widget)。
4. 对各个部件进行初始化(外观,状态等),同时为各种部件的事件创建监听器(listener)。
5. 调用Shell对象的open()方法以显示窗体 。
6. 各种事件进行监听并处理,直到程序发出退出消息。
7. 调用Display对象的dispose()方法以结束程序。
如下面的例子:
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
}
注意:导入SWT的原生库
想要运行Java应用程序,必须将SWT的原生包导入到项目中,否则该项目在运行程序时会报异常“java.lang.UnsatisfiedLinkError: no swt-win32-3063 in java.library.path”。
导入SWT原生包的步骤如下:
(1)右键单击项目名,在弹出菜单中选择“导入”。
(2)选择“文件系统”后单击“下一步”。
(3)通过“浏览”按钮找到SWT原生库的路径,原生库名称为“swt-win32-3063.dll”在plugin目录中,有些Eclipse版本可能打到org.eclipse.swt.win32.win32.x86_3.1.2.jar包中。
下面介绍一下类包
Display:与操作系统沟通的桥梁
每个swt程序在最开始都必须创建一个Display对象。Display对象起什么作用呢?它是swt与操作系统沟通的一座桥梁。它负责swt和操作系统之间的通信。它将swt/JFace的各种调用转化为系统的底层调用,控制操作系统为swt分配的资源。同时我们也可以通过Display对象得到操作系统的一些信息。
Display是一个“幕后工作者”,它为swt/JFace提供支持,但是你并不能够从某个用户界面中看到它的影子。
它为实现图形界面准备了最基本的条件。而在程序结束时我们必须显式地调用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 。例如:
Shell shell = new Shell(display,SWT.CLOSE | SWT.SYSTEM_MODAL);
最后得到的窗体没有最大化和最小化按钮,并且大小是固定不变的。
因为swt运行于各种平台之上,而这些平台上的窗口管理器千差万别,所以所有这些风格都不是肯定可以实现的。在swt的javadoc中,这被称为暗示(hints)。
Shell对象的方法大都和GUI有关,比如setEnabled()设定了窗体是否能够和用户进行交互,setVisble()设定了窗体是否可见,setActive()将窗体设为当前的活动窗口。
我们可以用open()方法打开一个窗体,close()方法关闭一个窗体。
从Widget和Control开始
Widget是Control的父类,而Control是我们使用的大多数部件的父类。我们在以前的一些编程语言中可能接触过“控件”或者“组件”之类的概念,部件(widget)的概念大体和这些相当。
在org.eclipse.swt.widgets中定义了众多的widget,甚至我们前面介绍的Shell也被当成widget的一种。
首先我们来介绍Widget。它是一个抽象类,也是所有widget的父类。通过介绍这个类,我们可以得出这所有widget的一些共有特性。
Widget的方法中dispose()方法我们在以前曾经见到过,调用这个方法时候,所谓的接收者(receiver,譬如我们这样写:awidget.dispose(),那么awidget就是接收者,而这句话所处的对象成为调用者或者caller)和接收者中所包含的其他widget会释放它们所占用底层操作系统的资源。这也就是说你不必显式地为程序中创建的每个widget进行dispose()调用,而只需要确保最外层的widget(比如Display)进行了dispose()就可以了。另外还可以通过isDisposed()判断是否该widget(接收者)已经进行了dispose。
Widget中的getStyle()方法得到widget的风格,而getDisplay()得到所处的Display对象。
此外Widget中还有两个重要方法getData()和setData(),这两个方法允许我们为一个widget附加其他的信息。特别是在你需要跨模块传递widget的时候,这个功能显得非常有用。比如如果一个文本框中显示了一段文章中的某句话,如果我们同时希望把这整篇文章的题目和作者附加上的话可以这样写:
1
atext.setData(
"
title
"
,
"
I Have A Dream
"
);
2
atext.setData(
"
author
"
,
"
Martin Luther King
"
);
在程序的其他部分可以用
atext.getData(“title”)
得到这篇文章的题目,或者用
atext.getData("author")
得到作者。
在前面我们提到过,Control是今后我们所使用大部分widget的父类。在这里我不单独进行介绍,而是在后面的部分中介绍。
创建部件
和创建其他java object一样,我们通过使用new操作符创建部件的实例。有一点比较特殊的可能你需要使用带参数的构造函数进行new操作。类似下面的程序:
Text text
=
new
Text(shell,SWT.CENTER);
这种方法适用于几乎所有的widget,其中第一个参数是父widget,也就是指明了该widget需要被放置道另外哪一个widget之中,而第二个参数是这个widget的风格。
大小和位置