【IT168 技术文章】多年以来,Java 语言已经“统治”了基于服务器的应用程序的开发领域。在该语言开发早期,人们将它吹捧为开发跨平台的桌面应用程序的解决方案。遗憾的是,事实上它从未符合过这种大肆宣传。在最终用户和开发人员社区需要抽象窗口工具箱(Abstract Window Toolkit,AWT)之外的一些其它功能之后,Sun Microsystems 引入了 Java 基础类(Java Foundation Classes,JFC)(也称为 Swing)来诱使开发人员重新考虑将 Java 语言用于开发 GUI 应用程序。虽然 Swing 确实为开发客户机端的应用程序提供了一个成熟且经证实的模型,但它仍缺少本机应用程序的可视外观和操作。
在开发和引入标准窗口小部件工具箱(SWT)之前,业内权威人士和开发人员都宣告 Java 语言不适合开发桌面应用程序。SWT 通过为开发人员提供一个创建应用程序的框架(所创建的应用程序完全逼真地模仿本机应用程序),正开始给客户机端 Java 的时机带来新气象。与其前辈(例如 AWT 和 JFC)不同,SWT 给开发人员提供了一个与平台无关的 API,该 API 与操作系统的本机窗口环境紧密地集成在一起。虽然,传统上认为 Eclipse 项目是 Java 的开放源码集成开发环境(IDE),但是该项目涉及的范围更广。在 Eclipse 的网站首页上,将 Eclipse 描述成“……一种通用工具平台 — 只不过是一个开放的可扩展 IDE,并没什么特别之处。”
虽然在开发本文提供的样本应用程序期间使用了 Eclipse,但是我们将着重演示如何在独立应用程序的上下文中使用 ActiveX 控件。
PDF 查看器应用程序
在查看如何将 ActiveX 控件集成到 SWT 应用程序的代码和实现细节之前,让我们查看一下所包含的样本应用程序的用途和结构。该应用程序是一个简单的 PDF 查看器,它允许用户使用 Adobe 的 Acrobat Reader 控件来查看 PDF 文件并与之交互。用户可以在 SWT 应用程序中浏览其硬盘驱动器、定位文件和查看 PDF 文档,如 图 1中所示。
图 1. 样本应用程序:在 Microsoft Windows XP 上运行的 PDF 查看器
环境需求
可以使用本文附加的链接下载样本 PDF 查看器应用程序。要测试 PDF 查看器应用程序,环境必须满足下列最低需求:
Microsoft Windows 操作系统
安装了 Java 2 SDK,标准版 1.4 或更高版本
安装了 Apache Ant 1.5.2 或更高版本
安装了 Adobe Acrobat Reader 5.0
虽然已经费心使 Ant 构建脚本可以跨平台使用,但是只在 Microsoft Windows XP 上测试和验证了 PDF 查看器应用程序。让我们从安装和设置样本应用程序开始吧。
安装和构建 PDF 查看器应用程序
要安装和构建 PDF 查看器应用程序,请完成下列步骤:
使用本文附加的链接下载源代码软件包。
将 pdfviewer.zip 文件解压缩到临时目录中。
在新创建的目录中执行下面这个命令: ant clean 。
在新创建的目录中执行下面这个命令: ant 。
如果您的环境满足需求并且配置正确,那么您应当会看到类似于下面这样的内容:
2 init:
3 [mkdir] Created dir: D:\PDFViewer\dist
4 compile-common:
5 compile-module:
6 [echo] Compiling ...
7 [mkdir] Created dir: D:\PDFViewer\build
8 [mkdir] Created dir: D:\PDFViewer\build\classes
9 [javac] Compiling 5 source files to D:\PDFViewer\build\classes
10 package-common:
11 [jar] Building jar: D:\PDFViewer\dist\pdfviewer.jar
12 default:
13 BUILD SUCCESSFUL
14
既然我们已经介绍了 PDF 查看器应用程序的基础知识,那就让我们研究一下如何在 SWT 应用程序中集成和使用 ActiveX 控件。因为我们这里的目的是讨论 ActiveX 集成,所以我们将不研究如何创建独立的 SWT 应用程序以及如何在 Microsoft Windows 中使用 ActiveX 控件。
清单 1 概述了 PDFViewer 类的基本结构并演示了如何将 ActiveX 控件集成到 SWT 应用程序。
清单 1. PDFViewer 类
2 2 {
3 3 private OleControlSite site;
4 4 private OleAutomation auto;
5 5
6 6 public PDFViewer()
7 7 {
8 8 super(null);
9 9 this.addMenuBar();
10 10 }
11 11
12 12 protected ControlcreateContents(Composite parent)
13 13 {
14 14 Shell shell = this.getShell();
15 15 shell.setText("PDFViewer");
16 16 shell.setSize(500, 450);
17 17
18 18 OleFrame frame = new OleFrame(shell, SWT.NONE);
19 19
20 20 try
21 21 {
22 22 site = new OleControlSite(frame,SWT.NONE, "PDF.PdfCtrl.5");
23 23 auto = new OleAutomation(site);
24 24
25 25 ...
让我们逐步研究这一代码片段:
每次应用程序启动时,都会创建 PDFViewer 类的新实例。
如第 3 行和第 4 行所示,我们需要定义两个对象: OleControlSite 和 OleAutomation 。 OleControlSite 对象变量处理与 ActiveX 控件的交互。 OleAutomation 对象允许开发人员访问特性并执行 ActiveX 控件所提供的命令。
在第 18 行上,定义了 OleFrame 对象。该对象是 ActiveX 控件的容器,并管理该控件的生命周期。
在第 22 行上,通过使用两个参数来实例化 site 变量:第一个参数包含对 OleFrame 的引用,第二个参数包含标识 ActiveX 控件的字符串。程序标识符(可在 Windows 注册表中找到)在 Microsoft Windows 中唯一地标识该控件。
在第 23 行上,使用对 OleControlSite 变量的引用来实例化 site 变量。
选择 PDF 文档
在用户可以查看 PDF 文档之前,用户需要从其工作站选择 PDF 文档。下面 清单 2中的代码说明了为最终用户打开一个文件对话框所必需的对象和方法。
清单 2. OpenAction 类
2 1 public class PDFViewer extends ApplicationWindow
3 2 {
4 3 private OleControlSite site;
5 4 private OleAutomation auto;
6 5
7 6 public PDFViewer()
8 7 {
9 8 super(null);
10 9 this.addMenuBar();
11 10 }
12 11
13 12 protected Control createContents(Composite parent)
14 13 {
15 14 Shell shell = this.getShell();
16 15 shell.setText("PDF Viewer");
17 16 shell.setSize(500, 450);
18 17
19 18 OleFrame frame = new OleFrame(shell, SWT.NONE);
20 19
21 20 try
22 21 {
23 22 site = new OleControlSite(frame, SWT.NONE, "PDF.PdfCtrl.5");
24 23 auto = new OleAutomation(site);
25 24
26 25 ...
27
让我们简要地研究这一代码片段:
每当用户从菜单栏选择“Open...”时,都要执行第 13 行上的 run 方法。
如第 15 行和第 16 行所示,创建一个 FileDialog 对象。如 图 2 所示,该对象向用户显示一个本机文件对话框。
第 18 行构造一个字符串,该字符串包含 PDF 文档在用户工作站上的位置。
第 20 行将 window 对象的数据类型转换成 PDFViewer 对象。
第 22 行执行 loadFile 方法并传入所选 PDF 文档的位置。在接下来的几节中,我们将更详细地研究 loadFile 方法。
图 2. Open File 对话框
在讨论如何在查看器应用程序中显示 PDF 文档之前,了解在 Adobe Acrobat Reader Active X( PDF.PdfCtrl.5 )组件中实际上可以使用哪些命令是有用的。样本代码软件包包括了由 IBM 开发的类。该类列出了 ActiveX 控件所公开的所有公用命令。
要枚举用于 PDF.PdfCtrl.5 控件的命令,请在 PDFViewer 目录中执行下面的命令: ant activex 。
如果您的环境配置正确,那么您应当会看到类似于下面这样的内容:
2 [java]Functions for PDF.PdfCtrl.5 :
3
4 [java]METHOD (id = 2) :
5 [java] Signature : boolean LoadFile([] String fileName)
6 [java] Description : null
7 [java] Help File : null
8
9 [java]METHOD (id = 3) :
10 [java] Signature : void setShowToolbar([] boolean On)
11 [java] Description : null
12 [java] Help File : null
13
14 [java]METHOD (id = 4) :
15 [java] Signature : void gotoFirstPage()
16 [java] Description : null
17 [java] Help File : null
18 ...
要查看用于任何其它 ActiveX 控件的命令,只要编辑包含在源代码中的 build.xml 文件,并用一些其它 ActiveX 的程序标识符替换该类的参数。下面的 Ant 目标说明了要插入控件的程序标识符的位置。
清单 3. 编辑 build.xml 文件
2 <target name="activex" depends="package-common">
3 <java classname="Main" fork="true">
4 <jvmarg value="-Djava.library.path=${eclipse.dir}windows"/>
5 <classpath>
6 <pathelement location="${dist.dir}/pdfviewer.jar"/>
7 <fileset dir="${eclipse.dir}" includes="*.jar"/>
8 <fileset dir="${eclipse.dir}windows" includes="*.jar"/>
9 </classpath>
10 <arg value="<insert some program identifier>"/>
11 </java>
12 </target>
13 ...
14
从该类输出的第一个命令是 LoadFile。让我们研究一下如何在 PDF 查看器应用程序中应用这个命令。
执行 ActiveX 命令
一旦用户选择了一个 PDF 文档, PDFViewer 类就需要执行 ActiveX 控件中所公开的命令。下面 清单 4中的代码说明了使 ActiveX 控件装入用户所选的 PDF 文档所需的对象和方法。
清单 4. PDFViewer 类
2 1 public void showPdfControl()
3 2 {
4 3 site.doVerb(OLE.OLEIVERB_SHOW);
5 4 }
6 5
7 6 public void loadFile(String file)
8 7 {
9 8 showPdfControl();
10 9
11 10 int[] rgdispid = auto.getIDsOfNames(newString[]{"LoadFile"});
12 11 int dispIdMember = rgdispid[0];
13 12
14 13 Variant[] rgvarg = new Variant[1];
15 14 rgvarg[0] = new Variant(file);
16 15
17 16 Variant pVarResult =auto.invoke(dispIdMember,rgvarg);
18 17 }
19 18...
20
让我们研究这一代码片段:
用户选择 PDF 文件之后,执行第 6 行上的 loadFile 方法。
第 8 行调用 showPdfControl 方法。必须使用 doVerb 命令激活 ActiveX 控件之后,该控件在应用程序中才可见。在 Eclipse 网站上标题为“ActiveX Support In SWT”的文章中可以找到动词的完整清单和概述。
第 10 行到第 16 行调用 ActiveX 控件中的 LoadFile 命令。
运行 PDF 查看器应用程序
要测试和运行 PDF 查看器应用程序,请完成下列步骤:
在将源代码解包的目录中执行下面这个命令: ant run 。
执行 Ant 脚本之后,应当会出现 PDF 查看器应用程序。
从 File 菜单选择“Open...”,以从工作站选择 PDF 文件。呈现所选的 PDF 文档。
结束语
SWT 库向 Java 开发人员提供一种功能强大的机制,使 Microsoft Windows ActiveX 控件集成到高度交互的客户机端应用程序。有了 SWT 对 ActiveX 控件和 OLE 文档的支持,研究如何创建外观极棒的且集成了本机窗口小部件和组件的应用程序是令人激动的。
本文相关内容下载:样本 PDF 查看器应用程序 Java 2 SDK,标准版 1.4.1 Ant 1.5.3