第 4 章 SWT 图形用户界面
本章要点
1. SWT 程序开发步骤。
2. SWT 常用组件的使用。
3. SWT 的布局。
4. SWT 的事件处理。
5. SWT Designer 简介。
本章难点
1. SWT 常用组件的使用。
2. SWT 的布局。
3. SWT 的事件处理。
4.1SWT/JFace 简介
SWT(Standard Widget Toolkit)即标准小窗口工具箱,是 IBM 公司推出的一种在 Eclipse
中使用的集成开发环境,SWT 提供可移植的 API,并与底层本机 OS GUI 平台紧密集成,它
是一个与本地窗口系统集成在一起的小部件集和图形库。SWT 由 JNI(Java Native Interface,
Java 本机接口)调用操作系统的内部 API,因此运行速度快,能够获得与操作系统的内部应
用程序相同的外观。
JFace 是一个用户界面工具箱,也是一个易用、功能强大的图形包,它简化了常见的图
形用户界面的编程任务。SWT 和 JFace 都是 Eclipse 平台上的主要组件。JFace 是在 SWT 的
基础上创建的,但 JFace 并不能完全覆盖 SWT 的功能,JFace 和 SWT 的关系如图 4.1 所示。
由于 JFace 的功能更强大,因此做图形界面开发时一般优先选用 JFace。
图4.1 JFace 和 SWT 的关系
4.1.1 SWT 程序开发步骤
在 eclipse 的 plugins 目录下,找到文件 org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar,
文件名中中 3.2.1 是 eclipse 的版本号,v3235 是 SWT 的序列号,不同的 eclipse 版本这两个
数字也不同。在 DOS 状态下,用 jar 命令将该文件解压,命令格式如下:
jar xf org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
该命令将指定的文件 org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar 解压到当前目录
下 。 解压后得到四个 DLL 文 件 : swt-win32-3235.dll , swt-awt-win32-3235.dll ,
swt-gdip-win32-3235.dll 和 swt-wgl-win32-3235.dll。这四个文件就是 SWT 的原生库文件。原
生库文件为 SWT 通过 JNI 访问 windows 本地 API 提供了接口,为使 Java 程序在启动时能
够访问这些文件,可以通过以下方法进行设置:
方法一:将这四个 DLL 文件复制到 jre 的 bin 目录下。
方法二:设置环境变量,在 PATH 中加入这几个 dll 文件所在的目录。
方法三:在 eclipse 的 Java 项目中导入原生库文件。操作方法是:
在 eclipse 的包资源管理器中,右单击项目名→导入→常规→文件系统→下一步→浏览
→选择 DLL 文件所在目录→确定→勾选 DLL 文件→完成。
导入 SWT 的原生库文件后,还要在 eclipse 的 Java 项目中配置构建路径,添加外部 JAR,
将文件 org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar 加入到项目中,操作方法是:
在 eclipse 的包资源管理器中,右单击项目名→构建路径→配置构建路径→库( L )→ 添
加 外部 JAR→在 eclipse 的 plugins 文件夹中找到该 jar 文件→打开→确定。
例 4.1 在 Java 应用程序中使用 SWT 的组件。
操作步骤:
① 新建一个 Java 项目,项目名为:sample4_1。
② 采用方法三在项目中导入原生库文件。
③ 配置构建路径,将 org.eclipse.swt.win32.win32.x86_3.2.1.v3235.jar 加入到项目中。
eclipse 包资源管理器可以看到导入的原生库文件和引入的 jar 文件,如图 4.2 所示。
④ 在项目中新建一个类,文件名为 HelloSWT.java。
⑤ 在类文件中写入代码。
图 4.2 包资源管理器 图 4.3 程序运行结果
HelloSWT.java 文件内容如下:
package edu.ch4;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.graphics.*;
class HelloSWT {
public static void main(String[] args) {
Display display=new Display();//创建一个display对象。
Shell shell=new Shell(display);//shell是程序的主窗体
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
shell.setLayout(null); //设置shell的布局方式
Text hello=new Text(shell,SWT.MULTI); //声明一个可以显示多行信息的文本框
shell.setText("Java应用程序"); //设置主窗体的标题
shell.setSize(200,100); //设置主窗体的大小
Color color=new Color(Display.getCurrent(),255,255,255);//声明颜色对象
shell.setBackground(color); //设置窗体的背景颜色
hello.setText("Hello, SWT World!\n\n你好,SWT世界!");//设置文本框信息
hello.pack(); //自动调整文本框的大小
//shell.pack(); //自动调整主窗体的大小
shell.open(); //打开主窗体
while(!shell.isDisposed()){ //如果主窗体没有关闭则一直循环
if(!display.readAndDispatch()){ //如果display不忙
display.sleep(); //休眠
}
}
display.dispose(); //销毁display
}
}
在包资源管理器中,右单击文件名 HelloSWT.java→运行方式→Java 应用程序,程序运行
结果如图 4.3 所示。该窗体具有典型的 Windows 风格。
分析本例的源代码,可以看到,创建一个典型的 SWT 应用程序需要以下步骤:
①创建一个 Display
②创建一个或多个 Shell
③设置 Shell 的布局
④创建 Shell 中的组件
⑤用 open()方法打开 Shell 窗体
⑥写一个事件转发循环
⑦销毁 display
4.1.2 SWT 中的包
SWT 是 Eclipse 图形 API 的基础,本节简单介绍一下 SWT 中常用的包。
1.org.eclipse.swt.widgets
最常用的组件基本都在此包中,如 Button、Text、Label、Combo 等。其中两个最重要
的组件是 Shell 和 Composite。Shell 相当于应用程序的主窗体;Composite 是容纳组件的容器,
相当于 SWING 中的 Panel 对象。
2.org.eclipse.swt.layout
主要的界面布局方式在此包中。SWT 对组件的布局也采用了 AWT/SWING 中的 Layout
和 Layout Data 结合的方式。
3.org.eclipse.swt.custom
对一些基本图形组件的扩展在此包中,比如其中的 CLabel 就是对标准 Label 组件的扩
展,在 CLabel 上可以同时加入文字和图片。在此包中还有一个新的布局方式 StackLayout。
4.org.eclipse.swt.event
SWT 采用了和 AWT/SWING 一样的事件模型,在包中可以找到事件监听类和相应的事
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
件对象。比如,鼠标事件监听器 MouseListener,MouseMoveListener 等,及对应的事件对象
MouseEvent。
5.org.eclipse.swt.graphics
此包中包含针对图片、光标、字体或绘图 API。比如,可通过 Image 类调用系统中不同
类型的图片文件。
6.org.eclipse.swt.ole.win32
对不同平台,SWT 有一些针对性的 API。例如,在 Windows 平台,可以通过此包很容
易的调用 OLE 组件,这使得 SWT 程序也可以内嵌 IE 浏览器或 Word、Excel 等程序。
4.2 SWT/JFace 常用组件
SWT/JFace 常用组件有按钮(Button 类)、标签(Label 类)、文本框(Text 类)、下拉框
(Combo 类)和列表框(List 类)等。
4.2.1 按钮组件
按钮(Button)组件是 SWT 中最常用的组件,Button 类的构造方法是:
Button(Composite parent,int style)
该方法有两个参数:
第一个参数 parent 是指 Button 创建在哪一个容器上。Composite(面板)是最常用的容
器,Shell(窗体)继承自 Composite,此参数也能接受 Shell 和任何继承自 Compsite 的类。
第二个参数 style 用来指定 Button 的式样。SWT 组件可以在构造方法中使用式样(style)来
声明组件的外观形状和文字的式样。SWT 组件的构造方法和 Button 类相似,参数的含义也
相同。
1.Button 组件常用式样
SWT.PUSH:按钮。
SWT.CHECK:多选按钮。
SWT.RADIO:单选按钮。
SWT.ARROW:箭头按钮。
SWT.NONE:默认按钮。
SWT.CENTER:文字居中,与 SWT.NONE 相同。
SWT.LEFT:文字靠左。
SWT.RIGHT:文字靠右。
SWT.BORDER:深陷型按钮。
SWT.FLAT : 平 面 型 按钮。
一个 Button 也可以指定多个式样,只要将指定的各个式样用符号“|”连接起来即可。
如:
Button bt=new Button(shell,SWT.CHECK|SWT.BORDER|SWT.LEFT);
表示创建的按钮 bt 是一个复选按钮(CHECK),深陷型(BORDER)、文字左对齐(LEFT)。
2 . Button 组件的常用方法
setText(String string):设置组件的标签文字。
setBounds(int x,int y,int width,int height):设置组件的坐标位置和大小(x 轴坐标,y 轴
坐标,组件宽度 width,组件高度 height)。
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn
setEnabled(Boolean enabled):设置组件是否可用。true:可用(默认值), false:不可用。
setFont(Font font):设置文字的字体。
setForeground(Color color):设置前景色。
setBackgrount(Color color):设置背景色。
setImage(Image image):设置显示的图片。
setSelection(Boolean selected):设置是否选中(仅对复选框或单选框有效)。 true:选中,
false:未选中(默认值)。
setToolTipText(String string):设置鼠标停留在组件上时出现的提示信息。
以上方法在其他组件中也可使用。
例 4.2 按钮示例。
按照例 4.1 的操作步骤建立项目、设置构建路径和引入原生库。类 Sample4_2.java 源代
码如下:
package edu.ch4;
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
public class Sample4_2 {
public static void main(String[] args) {
Display display=new Display();//创建一个display对象。
Shell shell=new Shell(display);//shell是程序的主窗体
//shell.setLayout(null); //设置shell的布局方式
shell.setText("按钮示例"); //设置主窗体的标题
Button bt1=new Button(shell,SWT.NULL); //创建默认按钮
bt1.setText("SWT.NULL"); //设置按钮上的文字
bt1.setBounds(10,10,75,30); //设置按钮显示位置及宽度、高度
Button bt2=new Button(shell,SWT.PUSH|SWT.BORDER); //创建深陷型按钮
bt2.setText("SWT.PUSH");
bt2.setBounds(90,10,75,30);
Button check1=new Button(shell,SWT.CHECK);//创建复选按钮
check1.setText("SWT.CHECK");
check1.setBounds(10,50,75,30);
Button check2=new Button(shell,SWT.CHECK|SWT.BORDER);//创建深陷型复选按钮
check2.setText("SWT.CHECK");
check2.setBounds(90,50,75,30);
Button radio1=new Button(shell,SWT.RADIO);//创建单选按钮
radio1.setText("SWT.RADIO");
radio1.setBounds(10,90,75,30);
Button radio2=new Button(shell,SWT.RADIO|SWT.BORDER);//创建深陷型单选按钮
radio2.setText("SWT.RADIO");
radio2.setBounds(90,90,75,30);
Button arrowLeft=new Button(shell,SWT.ARROW|SWT.LEFT);//创建箭头按钮(向左)
arrowLeft.setBounds(10,130,75,20);
Button arrowRight=new Button(shell,SWT.ARROW|SWT.RIGHT|SWT.BORDER);
arrowRight.setBounds(90,130,75,20);
shell.pack(); //自动调整主窗体的大小
PDF 文件使用 "pdfFactory" 试用版本创建 www.fineprint.cn