前言在使用Java 开发客户端程序时,有时会需要在界面中使用网页浏览器组件,用来显示一段HTML 或者一个特定的网址。
本文将介绍在界面中使用浏览器组件的四种方法,给出示例的代码,并且分析每种方法的优点与不足,便于Java 开发者在实际开发过程中根据自己的需要来选择。
回页首JDK 中的实现- JEditorPaneSwing 是一个用于开发Java 应用程序图形化用户界面的工具包,它是以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格,而且它是轻量级(light-weight)组件,没有本地代码,不依赖于操作系统的支持,这是它与AWT 组件的最大的区别。
在Swing 中,有一个组件是JEditorPane,它是一个可以编辑任意内容的文本组件。
这个类使用了EditorKit 来实现其操作,对于给予它的各种内容,它能有效地将其类型变换为适当的文本编辑器种类。
该编辑器在任意给定时间的内容类型由当前已经安装的EditorKit 来确定。
默认情况下,JEditorPane 支持以下的内容类型:•text/plain纯文本的内容,在此情况下使用的工具包是DefaultEditorKit 的扩展,可生成有换行的纯文本视图。
•text/htmlHTML 文本,在此情况下使用的工具包是javax.swing.text.html.HTMLEditorKit,它支持HTML3.2。
•text/rtfRTF 文本,在此情况下使用的工具包是类javax.swing.text.rtf.RTFEditorKit,它提供了对多样化文本格式(Rich Text Format)的有限支持。
JEditorPane 的常用方法JEditorPane()创建一个新的JEditorPane 对象JEditorPane(String url)根据包含URL 规范的字符串创建一个JEditorPaneJEditorPane(String type,String text)创建一个已初始化为给定文件的JEdiorPaneJEditorPane(URL initialPage)根据输入指定的URL 来创建一个JEditorPanescrollToReference(String reference)将视图滚动到给定的参考位置(也就是正在显示的URL 的URL.getRef 方法所返回的值)setContentType(String type)设置此编辑器所处理的内容类型setEditorKit(EditorKit kit)设置当前为处理内容而安装的工具包setPage(String url)设置当前要显示的URL, 参数是一个StringsetPage(URL page)设置当前要显示的URL, 参数是一个.URL 对象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 优缺点由于JEditorPane 是包含在J2SE 中的Swing 中,所以不需要导入第三方的jar 文件,相对来说比较简单。
但是JEditorPane 类对于网页中的CSS 的显示处理以及对JavaScript 脚本执行的支持很弱,而且官方似乎也没有对JEditorPane 类进行改进的打算,如果想用JEditorPane 来显示常见的网址,会发现显示出来的页面与IE,Firefox 有很大的差别,而且不能正常地处理页面逻辑。
所以如果仅仅用来显示比较简单的HTML, 用JEditorPane 还是一个不错的选择。
回页首开源的Java Web 浏览器实现- LoboLobo 项目是一个第三方的开源Java 浏览器项目,它的官方网站是/java-browser.jsp。
它是使用100%Java 代码实现的,而且能完整地支持HTML4、JavaScript 以及CSS2,除此之外,它还支持直接的JavaFX 渲染。
Lobo 本身就已经是一个完整的浏览器软件,同时它还提供了很多与网页浏览器相关的API,便于Java 程序员在自己的代码中使用或者进行扩展,其中包括渲染引擎API、浏览器API 以及插件系统API 等等。
具体的功能可以在它的官方网站上查看。
Lobo 中的FramePanelLobo 中实现Web 浏览器的类叫FramePanel,它提供了对HTML 页面显示的封装,并且提供了一些辅助的方法。
下面是一些常见方法的介绍:FramePanel()创建一个单独的FramePanel 对象,它能被添加到任意的Swing 窗口或者组件上。
boolean back()浏览器返回上一个页面boolean alert(String message)打开一个提示对话框,并且显示消息boolean forward()浏览器进入下一个界面boolean confirm(String message)打开一个确认对话框,显示特定的消息void navigate(String url)在这个组件里面显示特定的网址,参数一个网址的Stringvoid reload()重新加载当前的界面addContentListener(ContentListener listener)添加一个内容变化的监听器addNavigationListener(NavigationListener listener)添加一个导航(所显示的URL 变化)的监听器addResponseListener(ResponseListener listener)添加一个获取服务器返回结果的监听器•将这个对象添加到界面上。
Frame 是继承自JPanel, 所以可以像其他Swing 组件一样地添加到JPanel 或者窗口上面。
•通过调用FramePanel.navigate(url) 的方法来设置要显示的网址。
•不同于JEditorPane,FramePanel 已经默认处理了点击超链接的事件,不需要另外手动地编写代码来处理。
Lobo 浏览器API 的优缺点首先Lobo 的FramePanel 是100% 纯Java 的实现,具有良好的可移植性,在Window/Linux 平台下都能正常地运行。
它相比于Swing 中的JEditorPane,对于HTML、CSS 的显示以及对于JavaScript 的执行都有了比较大的提高。
经过实际的使用测试,在访问大多数网页的时候,都能比较正常的显示,与主流的IE/Firefox 效果类似,不过它对于CSS 支持还不是很完整,对于某些比较复杂的网页的,显示出入比较大。
另外Lobo 项目的文档还不是特别完善,这可能是限制它广泛使用的一个原因。
回页首JDICplus 中的浏览器组件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:///documentation/incubator/JDICplus/index.html,这个页面上展示了很多使用了JDICplus 这个库的DEMO,这里讨论的主要是对Windows IE 封装的浏览器组件。
使用JDICplus 的浏览器组件使用JDICplus,首先需要的是环境的配置。
JDICplus 需要的是JDK6.0 或更高的版本,您需要首先从 下载最新的版本。
否则代码不能正常编译运行。
其次是下载JDICplus 的类库,然后将它添加到classpath 中。
JDICplus 中对IE 封装的组件是org.jdic.web.BrTabbed,它除了封装了网页的显示,还处理了多个标签页的功能,所以它相对是比较强大的。
使用它的步骤如下:•初始化JDICplus 组件,设置它为非设计模式。
这个组件它默认的模式是设计模式,此时如果用来显示HTML 内容,会有很多无用的信息。
代码如下:org.jdic.web.BrComponent.DESIGN_MODE = false;•初始化一个BrTabbed 组件:•添加到界面中,BrTabbed 是JPanel 的子类,所以能直接在Swing 中使用,就像其他Swing 组件一样添加到JPanel 或者窗口中。
BrTabbed 类已经处理了点击超链接的事件,而且还支持多标签,这些不需要手动编写代码来处理。
JDICplus 浏览器组件的优缺点JDICplus 中的浏览器组件使用了JNI 来对IE 进行了封装,所以它显示的效果与IE 完全相同(还包括其中的右键菜单),而且BrTabbed 还内置了多标签的功能,使用起来相对比较简单,同样不需要去处理点击超链接的事件。