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