XULRunner with Java: JavaXPCOM Tutorial 2

本文介绍如何在Java应用程序中嵌入Firefox浏览器,并展示了如何通过JavaXPCOM访问浏览器功能,包括更改用户偏好设置及观察HTTP请求与响应。

4 在java代码里嵌入Firefox3
  现在可以去用一下有用的例子了。首先我们在一个java程序里使用SWT来嵌入一个Mozilla浏览器。现在,我们可以使用

org.eclipse.swt.browser.Browser类来实例化:browser = new Browser(shell, SWT.MOZILLA); 在这之前,我们需要使用ATF项目

,以及一下ATF插件。非常幸运,现在我们不需要这些补丁了。

4.1 配置环境
  为了在java程序里嵌入Mozilla浏览器,我们需要使用SWT来创建窗口和嵌入浏览器。
  4.1.1 安装swt
   下载对应操作系统的swt,加到classpath就好了
  4.1.2 配置swt
   运行后面例子需要的jar包:
   javaxpcom.jar
   MozillaInterfaces.jar
   MozillaGlue.jar
   swt.jar
   src.zip

4.2 Web Browser例子


接下来,我们将增加一下SWT widgets来实现通常的交换,比如输入url,前进与后退,菜单,和两种类型:
  传入一个参数制定XULRunner的路径
  不传入参数使用系统安装的XULRunner




5. 在浏览器里访问JavaXPCOM
   这一节里我们将讨论一下通过WebBrowser访问的功能。比如,改变浏览器的属性或者观察浏览器请求与响应。
   首先我们改变用户的preferences
   注:我只列出增加的部分代码。


另外一下Service也能被使用。我们已经可以改变Mozilla的属性来改变浏览器的行为,但是通过利用Service我们可以完成更有用的

任务。在下面的例子里我们将观察浏览器的请求和响应。在XPCOM里存在一个接口叫nsIObserver,它运行观察一个topic相关的event

,只要它被添加到observer Service里了。添加的方法是使用 void nsIObserverService.addObserver(nsIObserver anObserver,

String aTopic, boolean ownsWeak) 这个方法对一个特定的topic注册一个listener。anObserver是用来接受通知的一个接口,

aTopic是通知的topic,ownsWeak当nsIObserverService hold anObserver的一个strong的引用时设为false,否则设置为true。因此

,为了创建一个observer,我们必需实现nsIObserver接口,这个接口包含了一个方法 public void observe(nsISupports

aSubject, String aTopic, String aData)。

下面的例子的4个步骤:
  1,获得Service Manager
  2,获得Observer Service
  3,创建一个简单的HTTP observer
  4,把这个observer添加到监听请求和响应的Service里

!SESSION 2025-05-26 20:01:51.887 ----------------------------------------------- eclipse.buildId=4.29.0.20230907-1200 java.version=17.0.8.1 java.vendor=Eclipse Adoptium BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=zh_CN Framework arguments: -product org.eclipse.epp.package.java.product Command-line arguments: -os linux -ws gtk -arch x86_64 -product org.eclipse.epp.package.java.product !ENTRY ch.qos.logback.classic 1 0 2025-05-26 20:02:04.760 !MESSAGE Activated before the state location was initialized. Retry after the state location is initialized. !ENTRY org.eclipse.osgi 4 0 2025-05-26 20:02:07.219 !MESSAGE Application error !STACK 1 java.lang.UnsatisfiedLinkError: Could not load SWT library. Reasons: no swt-pi4-gtk-4962r3 in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib no swt-pi4-gtk in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib no swt-pi4 in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib Can't load library: /root/.swt/lib/linux/x86_64/libswt-pi4-gtk-4962r3.so Can't load library: /root/.swt/lib/linux/x86_64/libswt-pi4-gtk.so Can't load library: /root/.swt/lib/linux/x86_64/libswt-pi4.so at org.eclipse.swt.internal.Library.loadLibrary(Library.java:346) at org.eclipse.swt.internal.Library.loadLibrary(Library.java:255) at org.eclipse.swt.internal.gtk.OS.<clinit>(OS.java:97) at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:209) at org.eclipse.swt.internal.Converter.wcsToMbcs(Converter.java:155) at org.eclipse.swt.widgets.Display.<clinit>(Display.java:169) at org.eclipse.ui.internal.Workbench.createDisplay(Workbench.java:727) at org.eclipse.ui.PlatformUI.createDisplay(PlatformUI.java:183) at org.eclipse.ui.internal.ide.application.IDEApplication.createDisplay(IDEApplication.java:182) at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:125) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:651) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:588) at org.eclipse.equinox.launcher.Main.run(Main.java:1459) at org.eclipse.equinox.launcher.Main.main(Main.java:1432)
最新发布
05-27
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值