SWT 浏览器部件是 SWT 所提供的众多部件中较为复杂的一个,它提供了在 Java 应用程序中内嵌浏览器应用并通过 Java API 与之进行交互的能力。一个典型的应用场景是,开发者可以在客户段程序中嵌入一个内置浏览器,访问特定 HTML 应用,从而集 web 技术与客户端技术两者之所长,开发出具有更丰富功能和界面的软件。
本文主要包含两个方面的内容:1. 如何在 Java 应用程序中内嵌基于 Mozilla 的浏览器部件。 2. 使用 JavaXPCOM bridge 定制浏览器功能及与 XULRunner 进行更多交互。
本文中范例程序在 Mac OS 10.5, JDK1.5,XULRunner 1.8.1.3 环境下开发,编译与测试。
SWT( The Standard Widget Toolkit)最早在 3.0 版本中引入浏览器部件,早期目的是为了提供一些简单的接口,使用户得以在 Java 程序中显示和浏览 HTML 页面。
最早,在不同的平台上的浏览器部件基于不同的内核,比如,在 Windows 上基于 Internet Explorer 内核,在 Linux 上基于 Mozilla,在 Mac 上基于 Webkit 。这种机制使得 SWT 浏览器部件风格尽量接近于各个操作系统上预装的浏览器 (Windows 上的 Internet Explorer, Linux 上的 Firefox,Mac 上的 Safari),但却导致了在不同平台下浏览器部件的行为不一致性。比如在 Linux 上的浏览器部件下打开 about:config 链接,你会看到 Mozilla 的用户偏好配置页面 ( 见图 1),但在 Windows 和 Mac 的 SWT 浏览器部件将显示空白页面。
为了解决这种行为不一致的问题并对外提供统一接口,SWT 在 3.3M5 版本中提出了 "Mozilla Everywhere" 的概念,在 Windows 上和 Mac 上也提供了基于 Mozilla 内核的浏览器部件。并在 SWT 3.3M6 中增加了对 JavaXPCOM 的支持,这就使得开发者可以通过 Java 语言访问所有 Mozilla 的公开接口,从而为内嵌浏览器提供更灵活的定制行为。
图 1. 基于 Mozilla 的 SWT 浏览器部件上的用户偏好设置页面
为了使用基于 Mozilla 的 SWT 浏览器部件,需要在操作系统中预先安装与注册 XULRunner 。那,什么是 XULRunner 呢?“ XULRunner 是一个单独的“ Mozilla 运行时”安装包,可用于启动多种如同 Firefox 和 Thunderbird 一样丰富的 XUL+XPCOM 应用程序。它提供了安装、升级和卸载这些应用程序的机制。 XULRunner 还将提供 libxul,这个解决方案允许把 Mozilla 技术嵌入到其它项目和产品中。”(此段定义译自https://developer.Mozilla.org/En/XULRunner)简单来说,XULRunner 是基于 Mozilla 的浏览器(如 Firefox,Camino 等)的核心。
- 下载合适版本的 XULRunner 。下载地址:
http://releases.Mozilla.org/pub/Mozilla.org/XULRunner/releases
。注意:如果在 Mac 下进行开发或者需要使用 JavaXPCOM,则需要下载 1.8.1.2 或更新版本。- Windows: 将下载的 zip 包解压到合适的文件夹,将当前目录设置为解压后的文件夹。
- Linux: 将下载的 zip 包解压到合适的文件夹,将当前目录设置为解压后的文件夹。
-
Mac: 安装下载的 dmg 文件,将当前目录设置为 XULRunner 的安装位置。(通常为
/Library/Frameworks/XUL.framework/Versions/
Current) 。
如果之前版本的 XULRunner 注册为供所有用户使用,执行如下命令:
-
Windows:
XULRunner --unregister-global
-
Linux:sudo ./
XULRunner --unregister-global
-
Mac: sudo ./
XULRunner-bin --unregister-global
如果之前版本的 XULRunner 注册为供当前用户使用,则执行命令:
-
Windows:
XULRunner --unregister-user
-
Linux: ./
XULRunner --unregister-user
-
Mac: ./
XULRunner-bin --unregister-user
注册为供所有用户使用:
-
Windows:
XULRunner --register-global
-
Linux:sudo ./
XULRunner --register-global
-
Mac: sudo ./
XULRunner-bin --register-global
注册为供当前用户使用:
-
Windows:
XULRunner --register-user
-
Linux: ./
XULRunner --register-user
-
Mac: ./
XULRunner-bin --register-user
做完以上准备工作后,就可以通过简单的代码创建一个基于 Mozilla 的 SWT 浏览器部件。
Display display = new Display (); final Shell shell = new Shell (display); FillLayout layout = new FillLayout(); shell.setLayout(layout); Browser browser = new Browser(shell, SWT.MOZILLA); //1 browser.addTitleListener(new TitleListener(){ //2 public void changed(TitleEvent event) { shell.setText(event.title); } }); browser.setUrl("www.eclipse.org"); //3 shell.open (); while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); } display.dispose (); |
代码说明:
- 创建一个 SWT 浏览器部件,SWT.MOZILLA 样式用于指定此浏览器部件基于 Mozilla 。如果指定 SWT.NONE,则创建默认 SWT 浏览器部件(在不同平台上基于不同内核)
- 监听浏览器的标题事件 (TitleEvent) 。将窗口的标题设置为浏览器页面的标题。
- 访问
www.eclipse.org
。
Browser 类提供 setUrl(),getUrl(),setText(),getText() 等一系列方法和一系列监听器(Listener)供开发者使用,参见 SWT 文档。
Browser 类所提供的 API 在实际开发中的确可以满足大部分的用户需求。但是如果要扩展浏览器的功能,提供更丰富细腻的控制,则可以使用 JavaXPCOM 进行进一步的开发工作。
这里需要解释一下一些概念。
XPCOM:XPCOM 的英文全称是 Cross Platform Component Object Model,即跨平台的组件对象模型。它是一种跟 COM 类似的组件技术。所不同的是它是跨平台的。 XPCOM 体系中最重要的基本概念是接口(Interface),组件(Component) 和服务(Service) 。接口定义功能,组件可以实现多个接口的功能,组件实现的改变不影响功能。服务则可以被认为是一种单态的组件。也就是说,XULRunner 的基本组成单元是 XPCOM 组件,它由许多 XPCOM 组件拼接而成,这些组件之间通过接口相互调用,协同完成浏览器的种种功能。
XULRunner 基于 XPCOM 的本质,使得 Mozilla 有着很强的扩展性和可定制性。
JavaXPCOM:顾名思义,JavaXPCOM 就是 Java 与 XPCOM 的桥梁。 JavaXPCOM 允许在 Java 和 XPCOM 间进行会话,这样一来,Java 应用程序就可以访问 XPCOM 对象,并且 XPCOM 也可以访问任何实现了 XPCOM 接口的 Java 类。借助 JavaXPCOM,开发者可以在 Java 应用程序中同 XPCOM 或嵌入的 Gecko 对话。 JavaXPCOM 和 XPConnect(JavaScript-XPCOM 桥)十分相似,并且使用 XPIDL 实现其功能。
为了在 SWT 中使用 JavaXPCOM,我们需要做一些准备工作:下列步骤引自 http://www.eclipse.org/swt/faq.php#howusejavaxpcom
- 在 eclipse 中运行程序:
- 下载 org.Mozilla.xpcom plugin( 下载XULRunner 1.8.1.3 Eclipse插件)
- 导入 eclipse workspace
- 加入开发中的 plugin 的 required plugin 列表中。
- 独立运行的程序:
- 下载平台所需的 XULRunner SDK(下载XULRunner 1.8.1.3 SDK)
- 将
lib/MozillaInterfaces.jar
加入你的程序的 Java build path 。
在 SWT 中,如果你创建了一个基于 Mozilla 的 SWT 浏览器部件,且 MozillaInterface.jar 在 classpath 中,则于 JavaXPCOM 的初始化工作会在浏览器部件的创建过程通过反射自动完成。用户可以直接使用 JavaXPCOM 的所有功能。
如下代码显示了如何使用JavaXPCOM:
本例展示了如何通过 JavaXPCOM 编程改变浏览器文档中 DOM 结点的内容。(完整示例程序见附录)。
清单 2. 通过 JavaXPCOM 改变浏览器中 DOM 结点的内容
nsIWebBrowser webBrowser = (nsIWebBrowser)browser.getWebBrowser(); //1 if (webBrowser == null) { System.out.println("Could not get the nsIWebBrowser from the Browser widget"); return false; } nsIDOMWindow window = webBrowser.getContentDOMWindow(); //2 nsIDOMDocument document = window.getDocument(); //3 nsIDOMElement list= document.getElementById("input1"); //4 list.setAttribute("value", "value after change"); //5 |
代码说明:
- Browser 类提供了一个非常重要的方法 getWebBrowser(), 通过它,用户可以访问到 XPCOM 接口 nsIWebBrowser,nsIWebBrowser 是 XULRunner 中一个十分重要的组件,通过它,开发者可以获取浏览器的 DOM 窗口,进而获取整个 DOM 树的内容并对其进行修改。
- 获取浏览器 DOM 窗口。
- 从 DOM 窗口获取 DOM 文档。
- 获取 id 为 input1 的 DOM 结点。
- 修改 DOM 结点的属性。点击按钮后,文本框中的字符串将被改变为“ value after change ” 。
图 3. 用 JavaXPCOM 改变浏览器中 DOM 结点的内容
基于 Mozilla 的浏览器的用户偏好设置可以通过在浏览器中输入 about:config 访问到(见本文图一)。这些偏好设置可以通过编程改变。示例二展示了通过JavaXPCOM
为浏览器组件
设置用户代理的过程。(完整示例程序见附录)
清单 3. 通过 JavaXPCOM 为浏览器组件设置用户代理
Mozilla Mozilla = Mozilla.getInstance(); //1 nsIServiceManager serviceManager = Mozilla.getServiceManager(); //2 String contractID = "@Mozilla.org/preferences-service;1"; nsIPrefService prefService = (nsIPrefService) serviceManager.getServiceByContractID( contractID, nsIPrefService.NS_IPREFSERVICE_IID); //3 // Get a branch to access to the entire preference tree nsIPrefBranch branch = prefService.getBranch(""); //4 branch.setCharPref("network.proxy.http", "127.0.0.1"); //5 branch.setIntPref("network.proxy.http_port", 8080); //6 |
代码说明:
获取 Mozilla 类的单态实例。
获取 Mozilla 的服务管理器。 Mozilla 的服务管理器负责管理服务组件,开发者可以通过契约 ID(contract ID)向 Mozilla 请求相对应的服务。
通过用户配置管理的契约 ID “ @Mozilla.org/preferences-service;1 ”获取配置管理服务。
- 在配置树中获取管理 proxy 的分支。
设置 ProxyIP 。
- 设置 Proxy 端口。
设置完成后,通过 about:config 链接可以查看修改过的 proxy 设置。 |
图 4. 通过 JavaXPCOM 为浏览器组件设置用户代理
使用 XUL: 充分利用基于 Mozilla 的 SWT 浏览器部件的好处
XUL(XML User Interface Language)用 XML 来标记用户界面,且提供了一套通用控件供开发者使用。基于 Mozilla 的浏览器可以象渲染普通的 HTML 文件一样渲染 XUL 文件。因此,通过基于 Mozilla 的 SWT 浏览器部件,除了可以在应用中嵌入除了普通的 HTML 页面外,还可以在应用中嵌入 XUL,达到快速开发,充分利用各种开发技术的目的。
关于 XUL 的更多知识,请参阅 https://developer.Mozilla.org/en/XUL
下面用一个简单的例子演示 XUL 的使用:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window title="Calculator" style="width:145px" xmlns="http://www.Mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <vbox> <textbox id="anzeige" readonly="true" value="123456789" /> <grid> <rows> <row align="center"> <button label="7" /> <button label="8" /> <button label="9" /> <button label="+" /> </row> <row align="center"> <button label="4" /> <button label="5" /> <button label="6" /> <button label="-" /> </row> <row align="center"> <button label="1" /> <button label="2" /> <button label="3" /> <button label="*" /> </row> <row align="center"> <button label="0" /> <button label="," /> <button label="=" /> <button label="/" /> </row> </rows> </grid> </vbox> </window> |
把这段代码保存成 xul 后缀名的文件。通过基于 Mozilla 的 SWT 浏览器部件访问 XUL 文件,可以看到如图所示的界面:
优点:在各个平台上提供统一的行为。提供对 XUL(XML User Interface Language) 的支持。可通过 JavaXPCOM 提供对浏览器行为的定制和扩展。
缺点:需要在系统中预装 XULRunner 。
相关推荐
总结来说,使用Swing内嵌Mozilla内核浏览器需要XULRunner,这是一个涉及Java编程、系统环境配置、库导入和事件处理的综合任务。正确地完成这些步骤,你就可以在Swing应用中拥有一个功能强大的内置浏览器,为用户提供...
Java内嵌火狐核心浏览器是一种技术实现,它允许开发者在Java应用程序中集成Firefox浏览器的核心功能,为用户提供一种统一且可控的浏览体验。这种技术通常基于XULRunner,这是Mozilla Firefox的一部分,提供了一个...
在描述中提到的“内嵌火狐核心浏览器”,意味着这款JAVA浏览器采用了Mozilla Firefox的Gecko渲染引擎。Gecko是一种开源的网页排版引擎,能够解析和显示HTML、CSS、JavaScript等网页语言,因其稳定性和对Web标准的...
在给定的"漂亮的java嵌套火狐内核浏览器"项目中,开发者利用Java语言实现了以火狐内核为基础的嵌入式浏览器,旨在提供一种美观且高效的浏览体验。这个项目的特色在于它将火狐的浏览能力整合到Java应用程序中,使得...
通过这种方式,DJ Native Swing可以确保应用程序中的Web内容呈现与用户在其日常浏览器中看到的一致。 DJ Native Swing的主要特点包括: 1. **内嵌浏览器组件**:这个库的核心是内嵌浏览器组件,它可以在Java Swing...
Swing浏览器是一款基于Java Swing库开发的Web浏览器组件,它允许开发者在Java应用程序中嵌入一个功能完备的浏览器。Swing是Java Foundation Classes (JFC) 的一部分,提供了丰富的图形用户界面(GUI)组件,使得Java...
在IT领域,嵌入式浏览器是指能够集成到应用程序中,为用户提供浏览网页功能的组件。在Java编程环境中,SWT(Standard Widget Toolkit)提供了一种有效的方法来实现这样的功能。"Swt嵌入浏览器"这一主题涉及到如何...
使用JDIC,开发者可以创建一个内嵌的浏览器组件,用户可以直接在Java应用中浏览网页,而无需依赖外部浏览器。这个组件通常基于Netscape的Browser Widget Kit (BWK),它允许Java程序调用本地的Web浏览器引擎,如...
在SWT中内嵌火狐浏览器,意味着开发者能够创建一个应用程序,其中包含一个可以浏览网页的组件,而这个组件并不依赖于用户本地安装的浏览器。这在开发跨平台的应用程序时非常有用,因为它确保了在所有支持SWT的平台上...
在DJNativeSwing内置浏览器中,Xulrunner扮演了核心角色。它提供了一个稳定的运行时环境,使得DJNativeSwing可以加载和执行HTML、CSS和JavaScript代码。Xulrunner不仅支持基本的网页浏览,还支持许多高级特性,如...
Lobobrowser,一个专为Java Swing应用程序设计的内置浏览器组件,版本0.97.5,提供了在Java应用中集成Web浏览功能的可能性。这款开源软件允许开发者将网页浏览功能无缝地整合到他们的桌面应用中,极大地拓宽了Java...
5. 利用SWT内嵌Mozilla浏览器:SWT提供了一个名为`Browser`的类,可以用来在Java应用中嵌入Web浏览器。这种功能允许开发者在自己的应用程序中展示网页内容,或者实现基于Web技术的组件,如HTML编辑器。 总的来说,...
1. **本机Web浏览器支持**:JDIC允许Java应用程序嵌入和控制本地的Web浏览器,如Internet Explorer或Mozilla。这使得开发者可以构建混合型的应用程序,将网页内容与Java功能相结合,例如创建一个带有内嵌网页的桌面...
IeEmbed是Internet Explorer内嵌控件,而JDIC(Java Desktop Integration Components)则是一个用于Java应用程序与本地桌面环境集成的库,它提供了与操作系统交互的功能。 1. **IeEmbed**: IeEmbed.exe 是一个用于...
1. **本地Web浏览器支持**:JDIC提供了与Internet Explorer或Mozilla等本机Web浏览器交互的能力,使Java应用程序可以内嵌一个与系统默认浏览器一致的Web视图。 2. **系统托盘支持**:通过JDIC,Java应用程序可以...
- **本机Web浏览器支持**:允许Java应用程序内嵌并控制诸如Internet Explorer或Mozilla Firefox这样的本地Web浏览器,从而实现更丰富的互联网交互体验。 - **系统托盘支持**:提供了一个统一的API,使Java应用程序...
SpringBoot是一个由Pivotal Software开发的Java框架,它简化了基于Spring框架的应用程序开发,通过内嵌的Tomcat服务器,使得部署更便捷。本项目的核心是实现PDF在线预览功能,它利用了SpringBoot的Web服务特性,结合...
首先,`htmlunit-2.14.jar`是HtmlUnit库的核心组件,这是一个无头浏览器模拟器,允许开发者在Java环境中执行JavaScript并获取网页内容。HtmlUnit提供了对HTTP协议的支持,可以发送请求并接收响应,同时还能够解析和...
9. **与Java小程序交互**:JavaScript可以调用Java小程序或浏览器内嵌对象的属性和方法,增强了交互性。 10. **计算功能**:JavaScript可以执行各种计算任务。 11. **Date对象**:简化日期和时间的处理。 12. **文档...
在本文中,我们将深入探讨如何使用SpringBoot框架结合PDF.js库来实现在浏览器中预览Office文件。PDF.js是Mozilla开发的一个开源项目,主要用于在浏览器环境中高质量地渲染PDF文档,而SpringBoot则是一个流行的Java...