站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Eclipse 专题将 ActiveX 控件集成到 SWT 应用程序

将 ActiveX 控件集成到 SWT 应用程序

摘要: 通过使用标准窗口小部件工具箱(Standard Widget Toolkit,SWT),您可以开发独立的 Java 应用程序,它看起来和操作起来类似本机应用程序。如果您花了很多时间来开发用于 Windows 的 Java 客户机端应用程序,那么您或许希望将一些本机 Windows 组件集成到您的应用程序中。SWT,作为正在开发中的 Eclipse 项目的一部分,通过为您提供在独立 SWT 应用程序中方便地利用和集成 ActiveX 控件的方法来实现这一需求。

多年以来,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 控件。有关 Eclipse 项目的更多信息和背景知识, 请参阅本文末尾的 参考资料。

PDF 查看器应用程序

在查看如何将 ActiveX 控件集成到 SWT 应用程序的代码和实现细节之前,让我们查看一下所包含的样本应用程序的用途和结构。 该应用程序是一个简单的 PDF 查看器,它允许用户使用 Adobe 的 Acrobat Reader 控件来查看 PDF 文件并与之交互。 用户可以在 SWT 应用程序中浏览其硬盘驱动器、定位文件和查看 PDF 文档,如 图 1中所示。



<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

环境需求

可以使用 参考资料中的链接下载样本 PDF 查看器应用程序。要测试 PDF 查看器应用程序,环境必须满足下列最低需求:

虽然已经费心使 Ant 构建脚本可以跨平台使用, 但是只在 Microsoft Windows XP 上测试和验证了 PDF 查看器应用程序。让我们从安装和设置样本应用程序开始吧。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

安装和构建 PDF 查看器应用程序

要安装和构建 PDF 查看器应用程序,请完成下列步骤:

  1. 使用 参考资料中的链接下载源代码软件包。
  2. pdfviewer.zip 文件解压缩到临时目录中。
  3. 在新创建的目录中执行下面这个命令: ant clean
  4. 在新创建的目录中执行下面这个命令: ant

如果您的环境满足需求并且配置正确, 那么您应当会看到类似于下面这样的内容:

<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

Buildfile: build.xml

init:
    [mkdir] Created dir: D:\PDFViewer\dist

compile-common:

compile-module:
    [echo] Compiling ...
    [mkdir] Created dir: D:\PDFViewer\build
    [mkdir] Created dir: D:\PDFViewer\build\classes
    [javac] Compiling 5 source files to D:\PDFViewer\build\classes

package-common:
      [jar] Building jar: D:\PDFViewer\dist\pdfviewer.jar

default:

BUILD SUCCESSFUL
</td></tr></table>

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

使用 ActiveX 控件

既然我们已经介绍了 PDF 查看器应用程序的基础知识,那就让我们研究一下如何在 SWT 应用程序中集成和使用 ActiveX 控件。 因为我们这里的目的是讨论 ActiveX 集成,所以我们将不研究如何创建独立的 SWT 应用程序以及如何在 Microsoft Windows 中使用 ActiveX 控件。有关如何在 Eclipse Workbench 之外使用 SWT 组件的更多信息和背景知识,请参阅 Adrian Van Emmenis 的由三部分所组成的文章系列,本文末尾的 参考资料这一节中突出显示了这些文章。

清单 1 概述了 PDFViewer 类的基本结构并演示了如何将 ActiveX 控件集成到 SWT 应用程序。


清单 1. PDFViewer 类
<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

1   public class PDFViewer extendsApplicationWindow
2   {
3      private OleControlSite site;
4      private OleAutomation auto;
5
6      public PDFViewer()
7      {
8         super(null);
9         this.addMenuBar();
10      }
11
12      protected ControlcreateContents(Composite parent)
13      {
14         Shell shell = this.getShell();
15         shell.setText("PDFViewer");
16         shell.setSize(500, 450);
17
18         OleFrame frame = new OleFrame(shell, SWT.NONE);
19
20         try
21         {
22            site = new OleControlSite(frame,SWT.NONE, "PDF.PdfCtrl.5");
23            auto = new OleAutomation(site);
24           
25   ...
</td></tr></table>

让我们逐步研究这一代码片段:

  1. 每次应用程序启动时,都会创建 PDFViewer 类的新实例。
  2. 如第 3 行和第 4 行所示, 我们需要定义两个对象: OleControlSiteOleAutomationOleControlSite 对象变量处理与 ActiveX 控件的交互。 OleAutomation 对象允许开发人员访问特性并执行 ActiveX 控件所提供的命令。
  3. 在第 18 行上,定义了 OleFrame 对象。 该对象是 ActiveX 控件的容器,并管理该控件的生命周期。
  4. 在第 22 行上,通过使用两个参数来实例化 site 变量: 第一个参数包含对 OleFrame 的引用,第二个参数包含标识 ActiveX 控件的字符串。 程序标识符(可在 Windows 注册表中找到)在 Microsoft Windows 中唯一地标识该控件。
  5. 在第 23 行上,使用对 OleControlSite 变量的引用来实例化 site 变量。

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

选择 PDF 文档

在用户可以查看 PDF 文档之前,用户需要从其工作站选择 PDF 文档。下面 清单 2中的代码说明了为最终用户打开一个文件对话框所必需的对象和方法。


清单 2. OpenAction 类
<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

0   ...
1   public class PDFViewer extends ApplicationWindow
2   {
3      private OleControlSite site;
4      private OleAutomation auto;
5
6      public PDFViewer()
7      {
8         super(null);
9         this.addMenuBar();
10      }
11
12      protected Control createContents(Composite parent)
13      {
14         Shell shell = this.getShell();
15         shell.setText("PDF Viewer");
16         shell.setSize(500, 450);
17
18         OleFrame frame = new OleFrame(shell, SWT.NONE);
19
20         try
21         {
22            site = new OleControlSite(frame, SWT.NONE, "PDF.PdfCtrl.5");
23            auto = new OleAutomation(site);
24           
25   ...
</td></tr></table>

让我们简要地研究这一代码片段:

  1. 每当用户从菜单栏选择“Open...”时,都要执行第 13 行上的 run 方法。
  2. 如第 15 行和第 16 行所示, 创建一个 FileDialog 对象。如 图 2 所示, 该对象向用户显示一个本机文件对话框。
  3. 第 18 行构造一个字符串,该字符串包含 PDF 文档在用户工作站上的位置。
  4. 第 20 行将 window 对象的数据类型转换成 PDFViewer 对象。
  5. 第 22 行执行 loadFile 方法并传入所选 PDF 文档的位置。在接下来的几节中,我们将更详细地研究 loadFile 方法。



<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

列出 ActiveX 的命令

在讨论如何在查看器应用程序中显示 PDF 文档之前,了解在 Adobe Acrobat Reader Active X( PDF.PdfCtrl.5 )组件中实际上可以使用哪些命令是有用的。样本代码软件包包括了由 IBM 开发的类。该类列出了 ActiveX 控件所公开的所有公用命令。

要枚举用于 PDF.PdfCtrl.5 控件的命令,请在 PDFViewer 目录中执行下面的命令: ant activex

如果您的环境配置正确,那么您应当会看到类似于下面这样的内容:

<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

...
     [java]Functions for PDF.PdfCtrl.5 :
      
     [java]METHOD (id = 2) :
     [java]     Signature   : boolean LoadFile([] String fileName)
     [java]     Description : null
     [java]     Help File   : null
      
     [java]METHOD (id = 3) :
     [java]     Signature   : void setShowToolbar([] boolean On)
     [java]     Description : null
     [java]     Help File   : null
      
     [java]METHOD (id = 4) :
     [java]     Signature   : void gotoFirstPage()
     [java]     Description : null
     [java]     Help File   : null
...
</td></tr></table>

要查看用于任何其它 ActiveX 控件的命令,只要编辑包含在源代码中的 build.xml 文件,并用一些其它 ActiveX 的程序标识符替换该类的参数。下面的 Ant 目标说明了要插入控件的程序标识符的位置。


清单 3. 编辑 build.xml 文件
<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>

...
      

            

                     
                      
                        
                              
                              
                      

                      

            

      
...
</td></tr></table>

从该类输出的第一个命令是 LoadFile。让我们研究一下如何在 PDF 查看器应用程序中应用这个命令。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

执行 ActiveX 命令

一旦用户选择了一个 PDF 文档, PDFViewer 类就需要执行 ActiveX 控件中所公开的命令。 下面 清单 4中的代码说明了使 ActiveX 控件装入用户所选的 PDF 文档所需的对象和方法。


清单 4. PDFViewer 类
<table bgcolor="#eeeeee" width="100%" cellpadding="5" cellspacing="0" border="1"><tr><td>
0   ...
1   public void showPdfControl()
2   {
3      site.doVerb(OLE.OLEIVERB_SHOW);
4   }
5
6   public void loadFile(String file)
7   {
8      showPdfControl();
9
10      int[] rgdispid = auto.getIDsOfNames(newString[]{"LoadFile"});
11      int dispIdMember = rgdispid[0];
12
13      Variant[] rgvarg = new Variant[1];
14      rgvarg[0] = new Variant(file);
15
16      Variant pVarResult =auto.invoke(dispIdMember,rgvarg);
17   }
18...
</td></tr></table>

让我们研究这一代码片段:

  1. 用户选择 PDF 文件之后,执行第 6 行上的 loadFile 方法。
  2. 第 8 行调用 showPdfControl 方法。必须使用 doVerb 命令激活 ActiveX 控件之后,该控件在应用程序中才可见。 在 Eclipse 网站上标题为“ActiveX Support In SWT”的文章中可以找到动词的完整清单和概述(请参阅 参考资料以获取该文章的链接)。
  3. 第 10 行到第 16 行调用 ActiveX 控件中的 LoadFile 命令。有关如何使用在这些行中用到的每个对象的更多信息,请参阅 参考资料中的链接以获取 org.eclipse.swt.ole.win32 JavaDoc。

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

运行 PDF 查看器应用程序

要测试和运行 PDF 查看器应用程序,请完成下列步骤:

  1. 在将源代码解包的目录中执行下面这个命令: ant run
  2. 执行 Ant 脚本之后,应当会出现 PDF 查看器应用程序。
  3. 从 File 菜单选择“Open...”,以从工作站选择 PDF 文件。呈现所选的 PDF 文档。

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

结束语

SWT 库向 Java 开发人员提供一种功能强大的机制,使 Microsoft Windows ActiveX 控件集成到高度交互的客户机端应用程序。 有了 SWT 对 ActiveX 控件和 OLE 文档的支持,研究如何创建外观极棒的且集成了本机窗口小部件和组件的应用程序是令人激动的。


<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>


<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>

关于作者<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td colspan="3"></td></tr><tr align="left" valign="top"><td>

</td><td></td><td width="100%">

Jeff Gunther 是 Intalgent Technologies的总经理和创始人,这家公司是新兴的软件产品和解决方案供应商,其产品和解决方案采用 Java 2 企业版和 Lotus Notes/Domino 平台。Jeff 从早期的“Mosaic”(最早的 Internet Web 浏览器)出现之前的时代就投身于因特网行业。他拥有软件生命周期所有方面的专业经验,包括 Java/J2EE、DHTML、XML/XSLT、数据库设计和手持设备方面的特殊软件开发专业经验。可以通过 jeff.gunther@intalgent.com与他联系。

</td></tr></table>

<table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td>
</td></tr></table><table class="no-print" cellspacing="0" cellpadding="0" align="right"><tr align="right"><td>
<table border="0" cellpadding="0" cellspacing="0"><tr><td valign="middle">
</td><td valign="top" align="right"></td></tr></table></td></tr></table>


↑返回目录
前一篇: 在定制 SWT 组件中实现 MVC
后一篇: 使用 XML: Eclipse 中的布局、属性和首选项