SWT/JFace开发入门指南(一)〈转帖〉
写在前面的话
终于决定提起笔来写一篇关于 swt 和 JFace 编程的文章。在开始之前,我想先介绍一下你能够从将要出现的这一系列文章里得到什么,以及更重要的,你不能得到什么。我们的时间是如此之重要,以至于我们很难容忍把它浪费在自己不关心的事情上。
因为我刚开始写,所以到底这些文章会分成几次发布出来,也很难讲。但是我心里大体有这样一个提纲。也就是说,我打算介绍以下方面的内容:
l 设定 swt 以及 JFace 的开发环境
l swt 的一些简单部件( widget )介绍
l JFace 的一些入门性介绍
l swt 和 JFace 的事件模式
l 通过一些简单的例子说明如何利用 swt 和 JFace 编写图形化应用程序
我还要说明一下你不能从本文中得到的信息,这些信息包括:
l swt 和 JFace 相关内容非常深入的介绍:正如你从题目中了解到的,本文的定位是“入门”,也就是说假定的读者是那些对 swt 和 JFace 开发没有什么了解的人。所以我并不打算进行一个深入的介绍。因为我相信在入门之后,他们能够找到更好的资料(此外,我可能会写另外一个系列文章来介绍)。
l eclipse 的使用:我假定你在读这篇文章的时候已经对 eclipse 有所了解,所以不会解释到具体 eclipse 如何使用。
l eclipse 插件开发:虽然 eclipse 插件开发和本文内容有着千丝万缕的联系,我决定还是不把它列为介绍的内容。这方面,你仍然可以找到相当多的资料供参考。
与作者联系
如果你希望和我联系的话,你可以发 email 到[email protected] 。
延伸阅读
你不知道什么是 eclipse 么?你可以打开 http://www.eclipse.org ,这是 eclipse 的官方站点。
如果你希望对 eclipse 功能有详细的了解,你可以读一下这本书《 CONTRIBUTING TO ECLIPSE 》。
你不知道什么是 swt/JFace 么?你可以看一下 Wikipedia 中的介绍: http://en.wikipedia.org/wiki/Swt
http://en.wikipedia.org/wiki/Eclipse_%28computing%29
你对 eclipse ,swt 的历史感兴趣么?我强烈推荐你看一下这篇八卦: http://www.csdn.net/news/newstopic/20/20433.shtml
如果你对 eclipse 的一些新闻比较感兴趣的话,可以关注一下大胃的 blog: http://www.blogjava.net/sean/
最后你可以从一个地方得到所有你想要的东西: http://www.google.com
OK ,介绍到此为止,下面我开始正文:
Hello,world!: 搭建一个 swt/JFace 开发环境
在前面我曾经提到过:我们假定你对 eclipse 开发有一些了解。所以在这一节中,我将示范如何搭建一个 swt/JFace 开发环境,并且用一个老掉牙的 Hello,world! 程序作为示范。
建立开发环境
你完全可以不使用 eclipse ,而是使用别的 IDE 来进行开发,但是你需要有 swt/JFace 的一些库文件。
为了能够进行正常的 swt/JFace 开发,你需要做以下工作:
第一步 :建立一个 Java 工程:因为这个是大家都非常熟悉的,所以就不再赘述,你可以建立一个任何名字的 Java 工程。
第二步 :导入 swt 以及 JFace 的库文件。这也就意味着:将 swt/JFace 相关的库文件导入到工程的 classpath 中去。
需要的库文件有哪些呢?打开 eclipse 安装目录下的 plugins 文件夹,我们需要找到以下 jar 文件:
l org.eclipse.swt_3.x.x.jar
l org.eclipse.jface_3.x.x.jar
l org.eclipse.core.runtime_3.x.x.jar
l org.eclipse.ui.workbench_3.x.x.jar
这就是我们搭建一个基本 swt/JFace 程序所需要基本的一些库文件了。其中 3.x.x 视你所使用的 eclipse 版本而定,譬如我的 eclipse 版本是 3.1M6 ,这些 3.x.x 就是 3.1.0 。将他们加入你程序的 classpath 中。
为了更加清楚地说明如何做,你可以看一下下面的图 1 。这是我在 eclipse 的做法:打开工程的 properties 对话框,然后选择 Java Build Path 中的 Libraries 选项卡,将这些 jar 导入进来。当然你可以有自己的做法。
图 1
第三步 :为你的 java 程序添加本地库文件。如果你使用 windows 的话,你可能注意到在 eclipse 的 plugins 目录下还有一个 org.eclipse.swt.win32_3.x.x.jar ,将这个 jar 解压以后在 os/win32/x86 目录下有几个 dll 文件。这几个 dll 为 swt 通过 JNI 访问 windows 本地 API 提供了接口,我们需要将使 java 程序在启动时候即能够访问它。你可以有多种办法实现这个目的:
最简单的办法就是直接把这几个文件拷贝到你 jre 的 bin 目录下
你也可以设定环境变量时候,在 PATH 中加入这几个 dll 文件的目录。
你还可以在运行程序时候指定 java.library.path 为这几个 dll 所在的目录,在 eclipse 中,如果你打开 Help 菜单中 About eclipse Platform ,然后在出现的对话框中选择 configuration details 按钮,你可以在接下来出现的对话框中找到 java.library.path
配置 java.library.path 你还有另外一种办法,就是在最后运行程序的时候,从 Run 菜单中选择 Run As.. 而不是 Run As Java Application ,填写好必要的其他参数以后打开 Argument 选项卡,然后在 VM Argument 输入框中填写该参数为 dll 文件的路径,如图 2 所示
图 2
通过这三步工作,你就可以编写 swt/JFace 程序了。
Hello,World!
下面的内容就是我们 Hello,world! 的示例。首先建立一个类,我将这个类取名为 HelloSwt ,在我的工程中,它位于 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 }
34
代码段 1
关于这段代码的内容,我们会在下面的内容中进行详细介绍。现在我们可以尝试着运行一下,确定已经编译完成后从 eclipse 的 Package Explorer 中选中这个类然后点右键,在弹出的菜单中你会看到 Run As ,进一步选中这一项,然后在二级菜单中选“ Run As Java Application ”,如果运行正常的话你会看到如图 3 的运行结果:
图 3
Q&A: 出现了问题怎么办
Q: 我的程序编译时候出现了错误!
A: 如果是提示诸如 Text,Display 这些类不能够被成功引入,那么你需要检查一下是否我们前面提到的 jar 都已经被成功引入到你的 classpath
Q: 编译成功了但是不能运行,出现了异常
A: 检查一下异常信息,如果你的异常信息类似这样:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3128 in java.library.path
...
的话,那说明我们在前面第三步提到的那些 dll 没有正常工作,最好能够按照前面的说明重新配置一下。