java调用浏览器组件来_Java 网页浏览器组件介绍

在使用 Java 开发客户端程序时,有时会需要在界面中使用网页浏览器组件,用来显示一段 HTML 或者一个特定的网址。本文将介绍在界面中使用浏览器组件的四种方法,给出示例的代码,并且分析每种方法的优点与不足,便于 Java 开发者在实际开发过程中根据自己的需要来选择。

Swing 是一个用于开发 Java 应用程序图形化用户界面的工具包,它是以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格,而且它是轻量级(light-weight)组件,没有本地代码,不依赖于操作系统的支持,这是它与 AWT 组件的最大的区别。

在 Swing 中,有一个组件是 JEditorPane,它是一个可以编辑任意内容的文本组件。这个类使用了 EditorKit 来实现其操作,对于给予它的各种内容,它能有效地将其类型变换为适当的文本编辑器种类。该编辑器在任意给定时间的内容类型由当前已经安装的 EditorKit 来确定。

默认情况下,JEditorPane 支持以下的内容类型:

text/plain

纯文本的内容,在此情况下使用的工具包是 DefaultEditorKit 的扩展,可生成有换行的纯文本视图。

text/html

HTML 文本,在此情况下使用的工具包是 javax.swing.text.html.HTMLEditorKit,它支持 HTML3.2。

text/rtf

RTF 文本,在此情况下使用的工具包是类 javax.swing.text.rtf.RTFEditorKit,它提供了对多样化文本格式(Rich Text Format)的有限支持。JEditorPane()

创建一个新的 JEditorPane 对象

JEditorPane(String url)

根据包含 URL 规范的字符串创建一个 JEditorPane

JEditorPane(String type,String text)

创建一个已初始化为给定文件的 JEdiorPane

JEditorPane(URL initialPage)

根据输入指定的 URL 来创建一个 JEditorPane

scrollToReference(String reference)

将视图滚动到给定的参考位置(也就是正在显示的 URL 的 URL.getRef 方法所返回的值)

setContentType(String type)

设置此编辑器所处理的内容类型

setEditorKit(EditorKit kit)

设置当前为处理内容而安装的工具包

setPage(String url)

设置当前要显示的 URL, 参数是一个 String

setPage(URL page)

设置当前要显示的 URL, 参数是一个 java.net.URL 对象

setText(String t)

将此 TextComponent 的文本设置为指定内容,预期以此编辑器的内容类型格式提供该内容

要使用 JEditorPane 来显示 HTML,需要完成以下几个步骤:

创建一个 JEditorPane 对象

private JEditorPane jep=new JEditorPane();

设置 JEditorPane 显示的内容为 text/html

jep.setContentType("text/html");

设置它不可编辑

jep.setEditable(false);

处理超链接事件

jep.addHyperlinkListener(this);

JEditorPane 需要注册一个 HyperlinkListener 对象来处理超链接事件,这个接口定义了一个方法 hyperlinkUpdate(HyperlinkEvent e),示例代码如下:

public void hyperlinkUpdate(HyperlinkEvent event)

{

if(event.getEventType() == HyperlinkEvent.EventType.ACTIVATED)

{

try

{

jep.setPage(event.getURL());

}

catch(IOException ioe)

{

ioe.printStackTrace();

}

}

}

完整的代码可以在本文中 下载 到。在这个例子中,实现了一个 HyperlinkListener 接口,在方法实现中,

if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED)

这行代码表示首先判断 HyperlinkListener 的类型,在这里只处理事件类型为 HyperlinkEvent.EventType.ACTIVATED 的事件(即点击了某个超链接的事件),然后通过调用 HyperlinkEvent 的 getURL() 方法来获取超链接的 URL 地址。

最后通过调用 jep.setPage(event.getURL()) 方法,使得 JEditorPane 显示新的 URL 地址。

由于 JEditorPane 是包含在 J2SE 中的 Swing 中,所以不需要导入第三方的 jar 文件,相对来说比较简单。但是 JEditorPane 类对于网页中的 CSS 的显示处理以及对 JavaScript 脚本执行的支持很弱,而且官方似乎也没有对 JEditorPane 类进行改进的打算,如果想用 JEditorPane 来显示常见的网址,会发现显示出来的页面与 IE,Firefox 有很大的差别,而且不能正常地处理页面逻辑。所以如果仅仅用来显示比较简单的 HTML, 用 JEditorPane

还是一个不错的选择。

Lobo 项目是一个第三方的开源 Java 浏览器项目,它的官方网站是 http://lobobrowser.org/java-browser.jsp。 它是使用 100%Java 代码实现的,而且能完整地支持 HTML4、JavaScript 以及 CSS2,除此之外,它还支持直接的 JavaFX 渲染。

Lobo 本身就已经是一个完整的浏览器软件,同时它还提供了很多与网页浏览器相关的 API,便于 Java 程序员在自己的代码中使用或者进行扩展,其中包括渲染引擎 API、浏览器 API 以及插件系统 API 等等。具体的功能可以在它的官方网站上查看。

Lobo 中实现 Web 浏览器的类叫 FramePanel,它提供了对 HTML 页面显示的封装,并且提供了一些辅助的方法。下面是一些常见方法的介绍:

FramePanel()

创建一个单独的 FramePanel 对象,它能被添加到任意的 Swing 窗口或者组件上。

boolean back()

浏览器返回上一个页面

boolean alert(String message)

打开一个提示对话框,并且显示消息

boolean forward()

浏览器进入下一个界面

boolean confirm(String message)

打开一个确认对话框,显示特定的消息

void navigate(String url)

在这个组件里面显示特定的网址,参数一个网址的 String

void reload()

重新加载当前的界面

addContentListener(ContentListener listener)

添加一个内容变化的监听器

addNavigationListener(NavigationListener listener)

添加一个导航(所显示的 URL 变化)的监听器

addResponseListener(ResponseListener listener)

添加一个获取服务器返回结果的监听器

要想使用 FramePanel,首先需要在它的官方网站上面下载它的安装包,然后在安装目录下,可以看到有 lobo.jar 以及 lobo-pub.jar,将这两个 jar 文件添加到 classpath 中。类似于 JEditorPane, 要使用 FramePanel 有以下的步骤:

创建一个 FramePanel 的对象

FramePanel browser=new FramePanel();

将这个对象添加到界面上。Frame 是继承自 JPanel, 所以可以像其他 Swing 组件一样地添加到 JPanel 或者窗口上面。

通过调用 FramePanel.navigate(url) 的方法来设置要显示的网址。

不同于 JEditorPane,FramePanel 已经默认处理了点击超链接的事件,不需要另外手动地编写代码来处理。

首先 Lobo 的 FramePanel 是 100% 纯 Java 的实现,具有良好的可移植性,在 Window/Linux 平台下都能正常地运行。它相比于 Swing 中的 JEditorPane,对于 HTML、CSS 的显示以及对于 JavaScript 的执行都有了比较大的提高。经过实际的使用测试,在访问大多数网页的时候,都能比较正常的显示,与主流的 IE/Firefox 效果类似,不过它对于 CSS 支持还不是很完整,对于某些比较复杂的网页的,显示出入比较大。另外 Lobo 项目的文档还不是特别完善,这可能是限制它广泛使用的一个原因。

JDIC(Java Desktop Integration Components)项目的背景是当可以不考虑 Java 代码的平台可移植性的时候,能让 Java 程序与系统无缝地整合在一起。它提供给 Java 代码直接访问本地桌面的功能,其中包含了一系列的 Java 包以及工具,包含了嵌入本地浏览器组件的功能,启动桌面应用程序,在桌面的系统托盘处添加托盘图标以及注册文件类型关联等等。

JDICplus 是在 JDIC 项目上的另外一个扩展,它是一个 Java 的 win32 操作系统的扩展开发工具包,也就是说,它只能在 Windows 操作系统上使用,所以不具有平台无关性。它提供了很多类似于 Windows API 的功能,除了提供了对 IE 组件的封装之外,还有地图显示组件,以及编辑浏览 MS Word、MS PPT、MS Excel、MS Outlook、PDF 的组件。JDICplus 的官方网站是https://jdic.dev.java.net/documentation/incubator/JDICplus/index.html,这个页面上展示了很多使用了

JDICplus 这个库的 DEMO,这里讨论的主要是对 Windows IE 封装的浏览器组件。

使用 JDICplus,首先需要的是环境的配置。JDICplus 需要的是 JDK6.0 或更高的版本,您需要首先从 www.sun.com 下载最新的版本。否则代码不能正常编译运行。

其次是下载 JDICplus 的类库,然后将它添加到 classpath 中。

JDICplus 中对 IE 封装的组件是 org.jdic.web.BrTabbed,它除了封装了网页的显示,还处理了多个标签页的功能,所以它相对是比较强大的。使用它的步骤如下:

初始化 JDICplus 组件,设置它为非设计模式。这个组件它默认的模式是设计模式,此时如果用来显示 HTML 内容,会有很多无用的信息。代码如下:

org.jdic.web.BrComponent.DESIGN_MODE = false;

初始化一个 BrTabbed 组件:

private BrTabbed browser=new BrTabbed();

添加到界面中,BrTabbed 是 JPanel 的子类,所以能直接在 Swing 中使用,就像其他 Swing 组件一样添加到 JPanel 或者窗口中。

BrTabbed 类已经处理了点击超链接的事件,而且还支持多标签,这些不需要手动编写代码来处理。

JDICplus 中的浏览器组件使用了 JNI 来对 IE 进行了封装,所以它显示的效果与 IE 完全相同(还包括其中的右键菜单),而且 BrTabbed 还内置了多标签的功能,使用起来相对比较简单,同样不需要去处理点击超链接的事件。它的缺点首先在于它必须是使用 JDK6.0 或以上版本,要求比较高,同时它底层使用的是 Windows 操作系统相关的 API,所以不具有平台无关性。

SWT(The Standard Widget Kit)是 Java 的一套开源组件库,它提供了一种高效的创建图像化用户界面的能力,也是 Eclipse 平台的 UI 组件之一。它相比于 Swing,速度相对比较快,而且因为使用了与操作系统相同的渲染方式,界面上与操作模式上比较接近操作系统的风格。SWT 的跨平台性是通过不同的底层支持库来解决的。

org.eclipse.swt.browser.Browser 类是 SWT 中用来实现网页浏览器可视化组件的类,它能显示 HTML 文档,并且实现文档之间的超链接。它主要有以下的方法。

boolean back()

当前的会话返回到历史上前一个界面

boolean execute(String script)

执行特定的脚本

boolean forward()

当前的会话前进到历史上下一个页面

void refresh()

刷新显示当前的界面

setText(String html)

显示特定的 HTML 内容

setUrl(String url)

显示特定的网页内容,传入的参数是网页的地址

以下的代码演示了如何使用 SWT 中的 Browser 类:

SWT 的 Browser 类 demo

package org.dakiler.browsers;

import org.eclipse.swt.SWT;

import org.eclipse.swt.browser.Browser;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Event;

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.widgets.Listener;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Text;

public class SWTBrowserTest

{

public static void main(String args[])

{

Display display=new Display();

Shell shell=new Shell(display);

shell.setText("SWT Browser Test");

shell.setSize(800,600);

final Text text=new Text(shell,SWT.BORDER);

text.setBounds(110,5,560,25);

Button button=new Button(shell,SWT.BORDER);

button.setBounds(680,5,100,25);

button.setText("go");

Label label=new Label(shell,SWT.LEFT);

label.setText("输入网址 :");

label.setBounds(5, 5, 100, 25);

final Browser browser=new Browser(shell,SWT.FILL);

browser.setBounds(5,30,780,560);

button.addListener(SWT.Selection, new Listener()

{

public void handleEvent(Event event)

{

String input=text.getText().trim();

if(input.length()==0)return;

if(!input.startsWith("http://"))

{

input="http://"+input;

text.setText(input);

}

browser.setUrl(input);

}

});

shell.open();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

display.dispose();

}

}

本文介绍了四种在 Java 图形界面中显示 HTML 或者特定网页的方法,包括 Swing 中的 JEditorPane 组件、Lobo 浏览器的实现、JDICplus 以及 SWT 的 Browser 组件。

对于熟练使用 SWT 的 Java 开发者来说,使用 SWT 中的浏览器组件是一个很好的选择。如果是对于使用 Swing 的程序员来说,如果仅仅是显示不太复杂的 HTML,JEditorPane 就可以胜任了;如果不需要考虑到软件的可移植性,只需要在 Windows 下运行,那么使用 JDICplus 的浏览器组件是一个很好的选择;如果需要考虑可移植性,可以考虑使用 Lobo 浏览器。

下载

描述

名字

大小

下载方法

本文源代码

BrowserTest.zip

13 KB

学习

您可以在 Lobo 官方网站 中获取到关于 Lobo 开源 Java 浏览器的信息。

如果想了解 JDICplus 中其它组件的 demo, 您可以查看 JDICplus 网页。

“在 Java 程序中内嵌 Mozilla 浏览器”(developerWorks,2009 年 10 月):本文主要包含两个方面的内容:使用 SWT 浏览器部件在 java 代码中内嵌 mozilla 浏览器;使用 JavaXPCOM bridge 定制浏览器功能及与

xulrunner 进行更多交互。

技术书店:浏览关于这些和其他技术主题的图书。

讨论

王凯迪,来自 Convergys 上海研发中心,对 J2EE、J2ME 有一定理解,同时对开源项目比较感兴趣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端入行两年--教会了我这些道理

1.前言 光阴似箭,日月如梭。不得不感慨时间过得很快,2017差不多结束了,一下子我从事前端开发的时间已经两年了。这两年可以说是一波三折,回想这两年的经历,让我忍不住了写下了这篇文章,记录自己在这两年经历…

解决Nginx: [error] open() Nginx.pid

使用nginx -c的参数指定nginx.conf文件的位置 sudo /usr/sbin/nginx -c /etc/nginx/nginx.conf 转载于:https://www.cnblogs.com/vannn/p/9756132.html

巴霍巴利王

巴霍巴利王 惊心动魄的宫廷政变,必然铸就新的王朝更迭。时代的婉转,终究选上得民心的君主。我们的故事就这样悄无声息的将你带入幽深的宫廷内院。 夜幕之中,面对寒冷与杀戮,一位身负重伤王室女人,抱着一个新生儿&#…

Java中的观察者设计模式-示例教程

观察者模式是行为设计模式之一 。 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用。 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为Subject 。 根据GoF,观察者模式…

华为大数求和 java_大数乘积java

{"data":{"id":"8000-000000437045-0","name":"SEO专题页栏目分发组","type":"1","position":"8000-000000004003-0","status":1,"linkList":[{"id"…

IdnentiyServer-使用客户端凭据访问API

情景如下:一个客户端要访问一个api,不需要用户登录,但是又不想直接暴露api给外部使用,这时可以使用identityserver添加访问权限。 客户端通过clientid和secrect访问identitserver的Token Endpoint,获取accesstoken; 接…

重要·Flutter 首个预览版 发布

今天,InfoQ China 主办的 GMTC 全球大前端技术大会在北京举行,在这次大会中 Google 宣布发布 Flutter 首个预览版。这无疑让 Flutter 迈上了一个新的台阶。于此同时推出了 Flutter 社区中文资源 。可能有些同学还不了解 Flutter,这里再普及一…

复习做UWP时涉及到的几种加密签名相关

复习做UWP时涉及到的几种加密签名相关 原文:复习做UWP时涉及到的几种加密签名相关本人菜鸟一枚,大学里凭兴趣学了一点WP的皮毛,后来又幸运(或者不幸)的进了一家专注于Windows生态的公司做了一段时间的UWP。在博客园写点自己遇到的…

Java中的中介器设计模式-示例教程

中介者模式是行为设计模式之一 ,因此它处理对象的行为。 中介器设计模式用于在系统中不同对象之间提供集中式通信介质。 根据GoF,中介者模式意图是: 通过封装不同对象集相互交互和通信的方式,允许松散耦合。 允许每个对象集的动作…

java gc full gc_Java中full gc什么意思?

慕雪6442864除直接调用System.gc外,触发Full GC执行的情况有如下四种。1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:java.lang.Out…

springboot-RequestMappingHandlerMapping

作用&#xff1a;查看应用请求对应的ur和方法l情况 实例&#xff1a; RequestMappingHandlerMapping mapping applicationContext.getBean("requestMappingHandlerMapping",RequestMappingHandlerMapping.class);Map<RequestMappingInfo, HandlerMethod> map …

JavaScript中Ajax的用法

XMLHttpRequest 对象的属性和方法&#xff1a; open(method,url,async)  规定请求的类型、URL 以及是否异步处理请求  send(string)        将请求发送到服务器。  responseText       获得字符串形式的响应数据。  responseXML        获得 XM…

axios请求超时,设置重新请求的完美解决方法

自从使用Vue2之后&#xff0c;就使用官方推荐的axios的插件来调用API&#xff0c;在使用过程中&#xff0c;如果服务器或者网络不稳定掉包了, 你们该如何处理呢? 下面我给你们分享一下我的经历。 具体原因 最近公司在做一个项目, 服务端数据接口用的是Php输出的API, 有时候在…

从代码内部:骆驼路由引擎第一部分

因此&#xff0c;最近我重新燃起了对Apache Camel工作原理的兴趣。 Camel是一种功能强大的集成工具&#xff0c;用途非常广泛&#xff0c;但是只要我投入使用&#xff0c;我都会忍不住想&#xff1a;“嗯&#xff0c;这到底是怎么做到的&#xff01;” …猜想我只是有一个诀窍&…

java比较时间sql_如何正确比较日期 java.sql.Date

import java.sql.Date;...............例如今天是2010-12-2Date d1 new Date(System.currentTimeMili());Date d2 new Date(System.currentTimeMili()1);//比d1晚1毫秒日期上&#xff0c;我们认为d1和d2是相等的但是System.out.println(d1.before(d2));输出结果是true;其实我…

各种推导式合集

推导式的套路 之前我们已经学习了最简单的列表推导式和生成器表达式。但是除此之外&#xff0c;其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式&#xff0c;同样适用于其他推导式。 variable [out_exp_res for out_exp in input_list if o…

javascript总结36:DOM-点击按钮切换图片案例

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>Title</title> </head><body><a href"http://www.baidu.com" id"link">点击切换</a> <br&g…

一个9年的技术最近一直担心找不到工作

我是一个从早期ASP ACCESS程序员慢慢转到一名从设计、前端到PHP后台MYSQL数据库都做的技术。07年末初入上海第一份工作1350RMB/月做ASP开发。到了春节离职了&#xff0c;当时只因同事间的关系没那么和谐&#xff0c;感觉不开心才提出的离职&#xff0c;试用期3个月&#xff0c;…

Spring MVC控制器的单元测试:REST API

Spring MVC提供了一种创建REST API的简便方法。 但是&#xff0c;为这些API编写全面而快速的单元测试一直很麻烦。 Spring MVC测试框架的发布使我们可以编写可读&#xff0c;全面且快速的单元测试。 这篇博客文章描述了如何使用Spring MVC Test框架编写REST API的单元测试。 在…

flask框架基本使用(2)(响应与重定向)

#转载请留言联系 flask 框架基本使用(1)&#xff1a;https://www.cnblogs.com/chichung/p/9756935.html 1. flask 自定义返回状态码与响应头 from flask import Flask,make_responseappFlask(__name__)app.route("/") def index():#666是指定的状态码&#xff0c;nam…