java调用浏览器组件来_Java 网页浏览器组件介绍
在使用 Java 開發(fā)客戶端程序時(shí),有時(shí)會(huì)需要在界面中使用網(wǎng)頁(yè)瀏覽器組件,用來(lái)顯示一段 HTML 或者一個(gè)特定的網(wǎng)址。本文將介紹在界面中使用瀏覽器組件的四種方法,給出示例的代碼,并且分析每種方法的優(yōu)點(diǎn)與不足,便于 Java 開發(fā)者在實(shí)際開發(fā)過(guò)程中根據(jù)自己的需要來(lái)選擇。
Swing 是一個(gè)用于開發(fā) Java 應(yīng)用程序圖形化用戶界面的工具包,它是以抽象窗口工具包(AWT)為基礎(chǔ)使跨平臺(tái)應(yīng)用程序可以使用任何可插拔的外觀風(fēng)格,而且它是輕量級(jí)(light-weight)組件,沒有本地代碼,不依賴于操作系統(tǒng)的支持,這是它與 AWT 組件的最大的區(qū)別。
在 Swing 中,有一個(gè)組件是 JEditorPane,它是一個(gè)可以編輯任意內(nèi)容的文本組件。這個(gè)類使用了 EditorKit 來(lái)實(shí)現(xiàn)其操作,對(duì)于給予它的各種內(nèi)容,它能有效地將其類型變換為適當(dāng)?shù)奈谋揪庉嬈鞣N類。該編輯器在任意給定時(shí)間的內(nèi)容類型由當(dāng)前已經(jīng)安裝的 EditorKit 來(lái)確定。
默認(rèn)情況下,JEditorPane 支持以下的內(nèi)容類型:
text/plain
純文本的內(nèi)容,在此情況下使用的工具包是 DefaultEditorKit 的擴(kuò)展,可生成有換行的純文本視圖。
text/html
HTML 文本,在此情況下使用的工具包是 javax.swing.text.html.HTMLEditorKit,它支持 HTML3.2。
text/rtf
RTF 文本,在此情況下使用的工具包是類 javax.swing.text.rtf.RTFEditorKit,它提供了對(duì)多樣化文本格式(Rich Text Format)的有限支持。JEditorPane()
創(chuàng)建一個(gè)新的 JEditorPane 對(duì)象
JEditorPane(String url)
根據(jù)包含 URL 規(guī)范的字符串創(chuàng)建一個(gè) JEditorPane
JEditorPane(String type,String text)
創(chuàng)建一個(gè)已初始化為給定文件的 JEdiorPane
JEditorPane(URL initialPage)
根據(jù)輸入指定的 URL 來(lái)創(chuàng)建一個(gè) JEditorPane
scrollToReference(String reference)
將視圖滾動(dòng)到給定的參考位置(也就是正在顯示的 URL 的 URL.getRef 方法所返回的值)
setContentType(String type)
設(shè)置此編輯器所處理的內(nèi)容類型
setEditorKit(EditorKit kit)
設(shè)置當(dāng)前為處理內(nèi)容而安裝的工具包
setPage(String url)
設(shè)置當(dāng)前要顯示的 URL, 參數(shù)是一個(gè) String
setPage(URL page)
設(shè)置當(dāng)前要顯示的 URL, 參數(shù)是一個(gè) java.net.URL 對(duì)象
setText(String t)
將此 TextComponent 的文本設(shè)置為指定內(nèi)容,預(yù)期以此編輯器的內(nèi)容類型格式提供該內(nèi)容
要使用 JEditorPane 來(lái)顯示 HTML,需要完成以下幾個(gè)步驟:
創(chuàng)建一個(gè) JEditorPane 對(duì)象
private JEditorPane jep=new JEditorPane();
設(shè)置 JEditorPane 顯示的內(nèi)容為 text/html
jep.setContentType("text/html");
設(shè)置它不可編輯
jep.setEditable(false);
處理超鏈接事件
jep.addHyperlinkListener(this);
JEditorPane 需要注冊(cè)一個(gè) HyperlinkListener 對(duì)象來(lái)處理超鏈接事件,這個(gè)接口定義了一個(gè)方法?hyperlinkUpdate(HyperlinkEvent e),示例代碼如下:
public void hyperlinkUpdate(HyperlinkEvent event)
{
if(event.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
{
try
{
jep.setPage(event.getURL());
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
}
完整的代碼可以在本文中?下載?到。在這個(gè)例子中,實(shí)現(xiàn)了一個(gè) HyperlinkListener 接口,在方法實(shí)現(xiàn)中,
if(event.getEventType()==HyperlinkEvent.EventType.ACTIVATED)
這行代碼表示首先判斷 HyperlinkListener 的類型,在這里只處理事件類型為?HyperlinkEvent.EventType.ACTIVATED?的事件(即點(diǎn)擊了某個(gè)超鏈接的事件),然后通過(guò)調(diào)用 HyperlinkEvent 的 getURL() 方法來(lái)獲取超鏈接的 URL 地址。
最后通過(guò)調(diào)用 jep.setPage(event.getURL()) 方法,使得 JEditorPane 顯示新的 URL 地址。
由于 JEditorPane 是包含在 J2SE 中的 Swing 中,所以不需要導(dǎo)入第三方的 jar 文件,相對(duì)來(lái)說(shuō)比較簡(jiǎn)單。但是 JEditorPane 類對(duì)于網(wǎng)頁(yè)中的 CSS 的顯示處理以及對(duì) JavaScript 腳本執(zhí)行的支持很弱,而且官方似乎也沒有對(duì) JEditorPane 類進(jìn)行改進(jìn)的打算,如果想用 JEditorPane 來(lái)顯示常見的網(wǎng)址,會(huì)發(fā)現(xiàn)顯示出來(lái)的頁(yè)面與 IE,Firefox 有很大的差別,而且不能正常地處理頁(yè)面邏輯。所以如果僅僅用來(lái)顯示比較簡(jiǎn)單的 HTML, 用 JEditorPane
還是一個(gè)不錯(cuò)的選擇。
Lobo 項(xiàng)目是一個(gè)第三方的開源 Java 瀏覽器項(xiàng)目,它的官方網(wǎng)站是?http://lobobrowser.org/java-browser.jsp。 它是使用 100%Java 代碼實(shí)現(xiàn)的,而且能完整地支持 HTML4、JavaScript 以及 CSS2,除此之外,它還支持直接的 JavaFX 渲染。
Lobo 本身就已經(jīng)是一個(gè)完整的瀏覽器軟件,同時(shí)它還提供了很多與網(wǎng)頁(yè)瀏覽器相關(guān)的 API,便于 Java 程序員在自己的代碼中使用或者進(jìn)行擴(kuò)展,其中包括渲染引擎 API、瀏覽器 API 以及插件系統(tǒng) API 等等。具體的功能可以在它的官方網(wǎng)站上查看。
Lobo 中實(shí)現(xiàn) Web 瀏覽器的類叫 FramePanel,它提供了對(duì) HTML 頁(yè)面顯示的封裝,并且提供了一些輔助的方法。下面是一些常見方法的介紹:
FramePanel()
創(chuàng)建一個(gè)單獨(dú)的 FramePanel 對(duì)象,它能被添加到任意的 Swing 窗口或者組件上。
boolean back()
瀏覽器返回上一個(gè)頁(yè)面
boolean alert(String message)
打開一個(gè)提示對(duì)話框,并且顯示消息
boolean forward()
瀏覽器進(jìn)入下一個(gè)界面
boolean confirm(String message)
打開一個(gè)確認(rèn)對(duì)話框,顯示特定的消息
void navigate(String url)
在這個(gè)組件里面顯示特定的網(wǎng)址,參數(shù)一個(gè)網(wǎng)址的 String
void reload()
重新加載當(dāng)前的界面
addContentListener(ContentListener listener)
添加一個(gè)內(nèi)容變化的監(jiān)聽器
addNavigationListener(NavigationListener listener)
添加一個(gè)導(dǎo)航(所顯示的 URL 變化)的監(jiān)聽器
addResponseListener(ResponseListener listener)
添加一個(gè)獲取服務(wù)器返回結(jié)果的監(jiān)聽器
要想使用 FramePanel,首先需要在它的官方網(wǎng)站上面下載它的安裝包,然后在安裝目錄下,可以看到有 lobo.jar 以及 lobo-pub.jar,將這兩個(gè) jar 文件添加到 classpath 中。類似于 JEditorPane, 要使用 FramePanel 有以下的步驟:
創(chuàng)建一個(gè) FramePanel 的對(duì)象
FramePanel browser=new FramePanel();
將這個(gè)對(duì)象添加到界面上。Frame 是繼承自 JPanel, 所以可以像其他 Swing 組件一樣地添加到 JPanel 或者窗口上面。
通過(guò)調(diào)用 FramePanel.navigate(url) 的方法來(lái)設(shè)置要顯示的網(wǎng)址。
不同于 JEditorPane,FramePanel 已經(jīng)默認(rèn)處理了點(diǎn)擊超鏈接的事件,不需要另外手動(dòng)地編寫代碼來(lái)處理。
首先 Lobo 的 FramePanel 是 100% 純 Java 的實(shí)現(xiàn),具有良好的可移植性,在 Window/Linux 平臺(tái)下都能正常地運(yùn)行。它相比于 Swing 中的 JEditorPane,對(duì)于 HTML、CSS 的顯示以及對(duì)于 JavaScript 的執(zhí)行都有了比較大的提高。經(jīng)過(guò)實(shí)際的使用測(cè)試,在訪問(wèn)大多數(shù)網(wǎng)頁(yè)的時(shí)候,都能比較正常的顯示,與主流的 IE/Firefox 效果類似,不過(guò)它對(duì)于 CSS 支持還不是很完整,對(duì)于某些比較復(fù)雜的網(wǎng)頁(yè)的,顯示出入比較大。另外 Lobo 項(xiàng)目的文檔還不是特別完善,這可能是限制它廣泛使用的一個(gè)原因。
JDIC(Java Desktop Integration Components)項(xiàng)目的背景是當(dāng)可以不考慮 Java 代碼的平臺(tái)可移植性的時(shí)候,能讓 Java 程序與系統(tǒng)無(wú)縫地整合在一起。它提供給 Java 代碼直接訪問(wèn)本地桌面的功能,其中包含了一系列的 Java 包以及工具,包含了嵌入本地瀏覽器組件的功能,啟動(dòng)桌面應(yīng)用程序,在桌面的系統(tǒng)托盤處添加托盤圖標(biāo)以及注冊(cè)文件類型關(guān)聯(lián)等等。
JDICplus 是在 JDIC 項(xiàng)目上的另外一個(gè)擴(kuò)展,它是一個(gè) Java 的 win32 操作系統(tǒng)的擴(kuò)展開發(fā)工具包,也就是說(shuō),它只能在 Windows 操作系統(tǒng)上使用,所以不具有平臺(tái)無(wú)關(guān)性。它提供了很多類似于 Windows API 的功能,除了提供了對(duì) IE 組件的封裝之外,還有地圖顯示組件,以及編輯瀏覽 MS Word、MS PPT、MS Excel、MS Outlook、PDF 的組件。JDICplus 的官方網(wǎng)站是https://jdic.dev.java.net/documentation/incubator/JDICplus/index.html,這個(gè)頁(yè)面上展示了很多使用了
JDICplus 這個(gè)庫(kù)的 DEMO,這里討論的主要是對(duì) Windows IE 封裝的瀏覽器組件。
使用 JDICplus,首先需要的是環(huán)境的配置。JDICplus 需要的是 JDK6.0 或更高的版本,您需要首先從 www.sun.com 下載最新的版本。否則代碼不能正常編譯運(yùn)行。
其次是下載 JDICplus 的類庫(kù),然后將它添加到 classpath 中。
JDICplus 中對(duì) IE 封裝的組件是 org.jdic.web.BrTabbed,它除了封裝了網(wǎng)頁(yè)的顯示,還處理了多個(gè)標(biāo)簽頁(yè)的功能,所以它相對(duì)是比較強(qiáng)大的。使用它的步驟如下:
初始化 JDICplus 組件,設(shè)置它為非設(shè)計(jì)模式。這個(gè)組件它默認(rèn)的模式是設(shè)計(jì)模式,此時(shí)如果用來(lái)顯示 HTML 內(nèi)容,會(huì)有很多無(wú)用的信息。代碼如下:
org.jdic.web.BrComponent.DESIGN_MODE = false;
初始化一個(gè) BrTabbed 組件:
private BrTabbed browser=new BrTabbed();
添加到界面中,BrTabbed 是 JPanel 的子類,所以能直接在 Swing 中使用,就像其他 Swing 組件一樣添加到 JPanel 或者窗口中。
BrTabbed 類已經(jīng)處理了點(diǎn)擊超鏈接的事件,而且還支持多標(biāo)簽,這些不需要手動(dòng)編寫代碼來(lái)處理。
JDICplus 中的瀏覽器組件使用了 JNI 來(lái)對(duì) IE 進(jìn)行了封裝,所以它顯示的效果與 IE 完全相同(還包括其中的右鍵菜單),而且 BrTabbed 還內(nèi)置了多標(biāo)簽的功能,使用起來(lái)相對(duì)比較簡(jiǎn)單,同樣不需要去處理點(diǎn)擊超鏈接的事件。它的缺點(diǎn)首先在于它必須是使用 JDK6.0 或以上版本,要求比較高,同時(shí)它底層使用的是 Windows 操作系統(tǒng)相關(guān)的 API,所以不具有平臺(tái)無(wú)關(guān)性。
SWT(The Standard Widget Kit)是 Java 的一套開源組件庫(kù),它提供了一種高效的創(chuàng)建圖像化用戶界面的能力,也是 Eclipse 平臺(tái)的 UI 組件之一。它相比于 Swing,速度相對(duì)比較快,而且因?yàn)槭褂昧伺c操作系統(tǒng)相同的渲染方式,界面上與操作模式上比較接近操作系統(tǒng)的風(fēng)格。SWT 的跨平臺(tái)性是通過(guò)不同的底層支持庫(kù)來(lái)解決的。
org.eclipse.swt.browser.Browser 類是 SWT 中用來(lái)實(shí)現(xiàn)網(wǎng)頁(yè)瀏覽器可視化組件的類,它能顯示 HTML 文檔,并且實(shí)現(xiàn)文檔之間的超鏈接。它主要有以下的方法。
boolean back()
當(dāng)前的會(huì)話返回到歷史上前一個(gè)界面
boolean execute(String script)
執(zhí)行特定的腳本
boolean forward()
當(dāng)前的會(huì)話前進(jìn)到歷史上下一個(gè)頁(yè)面
void refresh()
刷新顯示當(dāng)前的界面
setText(String html)
顯示特定的 HTML 內(nèi)容
setUrl(String url)
顯示特定的網(wǎng)頁(yè)內(nèi)容,傳入的參數(shù)是網(wǎng)頁(yè)的地址
以下的代碼演示了如何使用 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("輸入網(wǎng)址 :");
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 或者特定網(wǎng)頁(yè)的方法,包括 Swing 中的 JEditorPane 組件、Lobo 瀏覽器的實(shí)現(xiàn)、JDICplus 以及 SWT 的 Browser 組件。
對(duì)于熟練使用 SWT 的 Java 開發(fā)者來(lái)說(shuō),使用 SWT 中的瀏覽器組件是一個(gè)很好的選擇。如果是對(duì)于使用 Swing 的程序員來(lái)說(shuō),如果僅僅是顯示不太復(fù)雜的 HTML,JEditorPane 就可以勝任了;如果不需要考慮到軟件的可移植性,只需要在 Windows 下運(yùn)行,那么使用 JDICplus 的瀏覽器組件是一個(gè)很好的選擇;如果需要考慮可移植性,可以考慮使用 Lobo 瀏覽器。
下載
描述
名字
大小
下載方法
本文源代碼
BrowserTest.zip
13 KB
學(xué)習(xí)
您可以在?Lobo 官方網(wǎng)站?中獲取到關(guān)于 Lobo 開源 Java 瀏覽器的信息。
如果想了解 JDICplus 中其它組件的 demo, 您可以查看?JDICplus 網(wǎng)頁(yè)。
“在 Java 程序中內(nèi)嵌 Mozilla 瀏覽器”(developerWorks,2009 年 10 月):本文主要包含兩個(gè)方面的內(nèi)容:使用 SWT 瀏覽器部件在 java 代碼中內(nèi)嵌 mozilla 瀏覽器;使用 JavaXPCOM bridge 定制瀏覽器功能及與
xulrunner 進(jìn)行更多交互。
技術(shù)書店:瀏覽關(guān)于這些和其他技術(shù)主題的圖書。
討論
王凱迪,來(lái)自 Convergys 上海研發(fā)中心,對(duì) J2EE、J2ME 有一定理解,同時(shí)對(duì)開源項(xiàng)目比較感興趣。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的java调用浏览器组件来_Java 网页浏览器组件介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “形音谁赏录”下一句是什么
- 下一篇: 北京环球影城残疾人免票吗