技术开发 频道

创建本机、跨平台 GUI 应用程序

  在本文中,我们将把 SWT 编译成共享对象,然后在产生的应用程序中动态引用这个对象。请注意,您可以使用应用程序代码将 SWT 编译成可执行文件,但是基于本文所讨论的范围,我们将坚持编译成共享对象。正如它的名称所表明的,共享对象的主要优点就是可以被共享。在运行时所有应用程序都可以动态地使用同一个对象。产生的可执行文件大小将小得多。

  使用下载源代码中包含的 Ant 构建文件(buildfile),我们将以自动方式编译 SWT。这个文件完成两个主要任务。首先,它将几个补丁程序应用到 SWT 源代码。(SWT 文件中有三个将不能用 GCJ 进行编译,这是因为一些小的编译器错误造成的 ― 例如,它不喜欢 int x, y, x1, y1 作为一行;必须将它们分成多行。在这些情况下,为这三个源文件编写了小的补丁程序以使它们在功能上等价。正如我以前提到的,GCJ 仍然在发展;这些错误会逐渐消除。)其次,构建文件使用提供的制作文件(makefile)来调用 make 。

  在清单 1 中显示的 Ant 构建文件已经在 Ant 1.3 和 Ant 1.4.1 上测试过了。请注意,在清单中我除去了注释以节省空间,但是有完整的代码可供下载。

  要运行构建,请遵循下列步骤:

  安装 Ant

  下载本文的 源文件,它包含构建文件、补丁程序和关联的制作文件,然后将它解压缩到一个目录中。

  导航至 SWT 目录,然后输入 ant 。构建文件假设您已经在 usr/local/eclipse 中安装了 Eclipse。如果 Eclipse 安装在另一个目录中,请输入 ant -Declipse_install_dir=your_directory ,其中 your_directory是您安装 Eclipse 的目录。

  注:如果不想使用 Ant 构建文件,您可以手工解压缩 SWT 源文件和字节码,然后使用 UNIX patch 命令来应用源代码中包含的那三个补丁程序(使用 .patch 文件)。然后,运行制作文件。

  清单 1. Ant 构建文件

1 <project name="BuildEclipse" default="cleanup">
2   <!--
3   The following properties can be overridden at the command-line.
4     e.g. ant -Declipse_install_dir=/usr/local/eclipse
5   -->
6   <property name="eclipse_install_dir" value="/usr/local/eclipse"/>
7   <property name="temp_dir" value="build_temp"/>
8   <property name="shared_object_name" value="swt.so"/>
9   <target name="init">
10     <mkdir dir="${temp_dir}"/>
11   </target>
12   <target name="unpack" depends="init">
13     <unzip src="${eclipse_install_dir}/plugins/org.eclipse.swt/swtsrc.zip"
14            dest="${temp_dir}"/>
15     <unjar src="${eclipse_install_dir}/plugins/org.eclipse.swt/swt.jar"
16            dest="${temp_dir}"/>
17   </target>
18   <target name="patch" depends="unpack">
19     <patch patchfile="TabFolder.patch"
20            originalfile="${temp_dir}/org/eclipse/swt/widgets/TabFolder.java"/>
21     <patch patchfile="Widget.patch"
22            originalfile="${temp_dir}/org/eclipse/swt/widgets/Widget.java"/>
23     <patch patchfile="TreeEditor.patch"/>
24     <move file="TreeEditor.java" todir="${temp_dir}/org/eclipse/swt/custom"/>
25   </target>
26   <target name="make" depends="patch">
27     <execon executable="touch">
28       <fileset dir="${temp_dir}" includes="**/*.java" excludes="**/*.class"/>
29     </execon>
30     <execon executable="touch">
31       <fileset dir="${temp_dir}" includes="**/*.class" excludes="**/*.java"/>
32     </execon>
33     <copy file="Makefile" todir="${temp_dir}"/>
34     <exec executable="make" dir="${temp_dir}">
35       <arg line="-f Makefile"/>
36     </exec>
37   </target>
38   <target name="cleanup" depends="make">
39     <move file="${temp_dir}/${shared_object_name}" todir="."/>
40     <delete dir="${temp_dir}"/>
41   </target>
42 </project>

  创建应用程序

  既然您已经将 SWT 构建到共享对象中,您就可以尝试样本应用程序。显示在清单 2 中的应用程序由一个显示经典“Hello, World!”消息的简单窗口组成。

  清单 2.“Hello, World”样本应用程序

1 import org.eclipse.swt.widgets.Display;
2 import org.eclipse.swt.widgets.Shell;
3 import org.eclipse.swt.widgets.Label;
4 import org.eclipse.swt.SWT;
5 import org.eclipse.swt.layout.RowLayout;
6 public class Hello {
7     public static void main(String[] args) {
8         Display display = new Display();
9         final Shell shell = new Shell(display);
10         RowLayout layout = new RowLayout();
11         layout.justify = true;
12         layout.pack = true;
13         shell.setLayout(layout);
14         shell.setText("Hello, World!");
15         Label label = new Label(shell, SWT.CENTER);
16         label.setText("Hello, World!");
17         shell.pack();
18         shell.open ();
19         while (!shell.isDisposed()) {
20             if (!display.readAndDispatch()) display.sleep ();
21         }
22        display.dispose ()
23

  要编译这个应用程序,请遵循下列步骤:

  将 SWT 共享对象(swt.so)复制到 Hello World 目录中,然后输入下列命令。(请记住,如果在 /usr/local/eclipse 以外的目录中安装了 Eclipse SDK,请用您的目录来替换它。)

1 gcj -CLASSPATH=/usr/local/eclipse/plugins/org.eclipse.swt/swt.jar
2   -c Hello.java -o Hello.o
3 gcj -main=Hello -o Hello Hello.o swt.so
4

  接下来,使用下列命令设置库路径(假设您正在使用 bash shell):

1 export LD_LIBRARY_PATH=
2   .:/usr/local/eclipse:/usr/local/eclipse/plugins/org.eclipse.swt/ws/motif
3

  输入 ./Hello ,会看到本机编译的 GUI Java 应用程序出现屏幕上!

   展望

  对 Windows 应用程序的编译很快就可以实现了,虽然目前仅在 Linux/Motif 和 Windows 上支持 SWT,但正在进行积极的开发以在 Linux 上将 SWT 移植到 GTK/GNOME。SWT 还可以在 AIX 和 Solaris 上的 Motif 下工作,但是还未经全面测试。最后,在 Windows CE、QNX 和 Macintosh 移植上已经完成了一些工作,但是目前主要的侧重点还是针对其它平台。

   结束语

  众所周知,Java 语言具有一些重要的特性。它是优雅的,提供了面向对象概念的出色实现,并且具有一个非常有用的标准类库。将这些优点与 GCJ 和 SWT 相结合使 Java 语言定位成在服务器和 Web 浏览器上建立其基础,然后转向最终用户应用程序领域。

        代码下载

0
相关文章