天天看點

java實作浏覽器_利用Java實作網頁浏覽器

使用VC,VB或者C#的開發者們對于在程式裡面嵌入一個網頁來說,那真是小事一樁。但是在JAVA裡面,卻幾乎是不可能實作的任務。 JEditorPane雖然說可以打開網頁,但是它那解析速度以及解析品質,對于今天日益複雜的網頁内容來說,就像沒有一樣。今天我們就使用一個開源的元件(jdic)來實作在JAVA程式裡面嵌入網頁的效率。

下面言歸正轉吧,我們來介紹一下這個開源的元件,它的名字叫 JDIC(JDesktop Integration Components),網址為:https://jdic.dev.java.net/,它提供了一種通路桌面元件的API,其中JDK6.0就采納了其中了一些,比如系統欄圖示的SystemTray和SystemIcon,還有代表桌面的Desktop等等,可見這個API是挺不錯的。由于網頁浏覽器的特殊性,标準的JDK并沒有把它加入進來,但是我們一樣可以下載下傳它來使用這個功能。明顯地,這個功能是用本地方法實作的,是以下載下傳完以後,把 jdic.dll放到我們的path目錄中,比如system32檔案夾下面,然後我們就可以使用它的功能進而增加我們的JAVA程式了。

如果你經常通路java.net,或者讀過JavaOne的新聞報道,你可能聽過 Jdesktop Integration Components(JDIC)。這些新的API終于能讓Java開發人員做那些我們曾經羨慕本地同胞們所做的那些事情了。本文将給你一個有關JDIC 特性的全面介紹,每一個特性都帶有一個小例子,以及要邁出第一步該下載下傳些什麼的一個清單。除了SaverBeans子項目我們要在第二部分介紹外,我們将試驗所有的API

JDesktop Integration Components,或JDIC,是一個給Java開發人員提供通過交差平台API存取本地特性的包羅萬象的項目。該項目由Sun的Desktop組啟動,目的是讓Java應用能更好地和它們所運作的桌面環境內建。為了能從開發人員那裡得到想要的特性的快速回報,他們将JDIC做成了開源項目。盡管目前沒有計劃,但JDIC團隊正考慮把JDIC的特征加入Java核心類庫的未來版本中去

JDIC分為五個部分和一個孵化中的項目:

l 桌面:為了打開、編輯和用email郵寄檔案來打開桌面程式;

l 檔案類型:設定桌面檔案類型關聯;

l 浏覽器:在AWT畫布上嵌入本地浏覽器(Internet Explorer或者Mozilla);

l 包裝器:把Java Web Start程式轉換成本地安裝程式的指令行工具;

l 托盤API:支援系統托盤圖示和彈出式菜單;

l SaverBeans:Java中的系統螢幕保護;

桌面元件

桌面元件是最簡單和可能是最有用的JDIC元件了。它專用于基本的桌面服務,如在正确的編輯器裡打開一個檔案,建立一封 Email,或者把一個URL發送到預設的web浏覽器。建構這些東西需要做很多的工作,但使用起來卻非常容易。如果你想告訴作業系統打開一個Word文檔,調用Desktop.open(new File(“resume.doc”));就可以了,就這麼簡單。

Org.jdesktop.jdic.desktop包隻有三個類:Desktop,Message和DesktopException。 Desktop類是靜态的不能被執行個體化。它有幾個打開、編輯和列印檔案的方法。你也能打開一個新的email和用文本填充它。這就是Message使用的地方,它能讓你設定接收人,郵件體,附件,和其他部分。

有關Desktop元件包最好的事就是它用起來是多麼地簡單。你不需要注冊任何特殊的驅動或者修改基于目前平台的配置。這些東西都已經在幕後做好了。隻要你的jdic.jar檔案在你的類路徑中和本地庫在你的庫路徑中(通常你把它和.jar檔案放在一起),代碼就可以工作了。下邊是一個啟動一個浏覽器的線上例子:

import org.jdesktop.jdic.desktop.*;

import java.net.*;

public class DesktopTest {

public static void main(String[] args)

throws Exception {

Desktop.browse(

new URL("http://www.yahoo.com/")

);

}

}

檔案類型元件

JDIC的下一個核心元件是檔案類型包,它用來設定檔案類型關聯。這意味着你能告訴作業系統什麼檔案用什麼程式打開,例如總是用Word打開文本檔案而不是用寫字闆打開。用這個API你能查詢、設定和删除基于檔案擴充名和mime類型的檔案類型關聯。

假如那個檔案類型通常是某種作業系統上特有的,檢索關聯或者注冊應用本身而不是設定關聯時,這個API顯得更為有用。例如,在Windows下,通常的文本檔案的關聯是調用在衆所周知的目錄下的notepad.exe。在Gnome下,它可能調用/usr/local/bin/gedit。由于這是和系統相關的,除了把java應用綁定到自己檔案的類型,設定關聯可能不是非常有用。盡管如此,不管你用它做什麼,檔案類型元件通過處理系統資料庫和MIME 類型資料的方式為你處理了所有繁重的工作。

下邊是一個設定檔案關聯的簡短的例子:

import org.jdesktop.jdic.filetypes.*;

import java.net.*;

public class FileTypesTest {

public static void main(String[] args)

throws Exception {

Action action = new Action("open",

"C:WINDOWSsystem32

otepad.exe %1");

Association assoc = new Association();

assoc.addFileExtension(".mchat");

assoc.setMimeType("application/mad-chatter"); 浏覽器元件

JDIC的第三個主要元件是浏覽器元件。不象前邊的兩個,它們隻是讓你存取系統服務,這個元件給你了一個真正在圖形應用裡使用的 AWT器件。以前,你可以使用第三方的嵌入式元件或純java的浏覽器,但JDIC讓你把使用者預設的web浏覽器嵌入到你的應用中,這些為我們創造了很多機會。現在寫一些有全面Web支援的RSS閱讀器變成了可能的事情。由于你不必把本地浏覽器包含進你的應用中,下載下傳速度也更快了。

浏覽器元件API可以讓你通路幾個浏覽器事件以及在曆史記錄上的控制(向前,後退,重新整理)。未來修訂的API版本希望能提供更多存取浏覽器和任意裝載的文檔的功能。

在你的應用裡使用浏覽器元件實在是非常容易:

import org.jdesktop.jdic.browser.*;

import java.net.*;

import javax.swing.*;

public class BrowserTest {

public static void main(String[] args) throws Exception {

WebBrowser browser = new WebBrowser();

browser.setURL(new URL("http://java.net"));

JFrame frame = new JFrame("Browser Test");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(browser);

frame.pack();

frame.setSize(500,500);

frame.setVisible(true);

}

}

正如你所看到的那樣,WebBrowser對象僅僅是一個你可以把它放入一個标準的Jframe中的AWT元件。Main方法的第一行建立了一個新的WebBrowser,第二行設定了你想顯示的URL。其他的代碼建立了一個frame,把浏覽器加入其中,并使得frame可見

記住WebBrowser是個本地AWT元件,是以你可能陷入與Swing結合的困境。混合它們的兩個規則是 1)不要讓Swing和AWT元件重疊和 2)在你的菜單上調用setLightWeightPopupEnabled(false)否則它們将消失在浏覽器元件後邊。

浏覽器元件将立刻使用使用者的預設Web浏覽器,它們通常是Internet Explorer或Mozilla。你不能象使用Jrex(http://jrex.mozdev.org/)那樣把Mozilla的必須的部分和你的應用綁在一起。這種做法可能在Windows上行得通,IE絕對是可以的,但在Linux上有更多的問題,因為它上邊的預設浏覽器不一定是 Mozilla(例如,在KDE上它可能是Konquorer)。希望這些問題随着項目的成熟能夠解決,但目前它對許多項目是很有用的。

包裝器元件

不象其他的JDIC,包裝器子產品不是API,而是把JNLP(Java Web Start)應用轉換成本地安裝程式(Linux上是rpms,Solaris上是pkgs,Windows上是msis)的一組指令行工具。這不是說象 Jsmooth或JexePack那樣把你的應用轉換成.exe;它僅僅為Web Start應用提供點選安裝的功能。在程式安裝之後,它将使用JNLP通過Internet更新自己,做Web Start應用能做的所有的其他事情。

包裝器元件需要J2SE5.0和本地工具。對Windows而言,你需要安裝Microsoft的MSI SDK。一旦你的環境建立了起來,就能使用指令行工具jnlp2msi,jnlp2rpm,和jnlp2pkg把你的Web Start應用轉換成與平台相關的安裝程式。

系統托盤

托盤圖示API曾是一個孵化中項目,但由于java.net社群的勤奮努力,它已經成熟并把它提升到一個完全的JDIC元件的地位。假如你的作業系統有托盤的概念的話,它的目的是在螢幕的右下角建立小程式狀态圖示。實際上,這種作業系統是指Windows和Linux。Mac OS X使用者則沒有這個運氣。它也支援彈出菜單和為圖示提供自動工具提示。象其他JDIC一樣,系統托盤支援需要本地代碼,但你可以用Java API編碼來使用預編譯的本地庫。

由于這個API使用範圍非常小,是以它們隻有兩個類: SystemTray和TrayIcon。SystemTray類有一個靜态工廠方法用于存取系統的預設托盤。TrayIcon讓你把一個 JpopupMenu和Icon添加到系統托盤的下一個可用的位置上。最後,調用 SystemTray.getDefaultSystemTray().addTrayIcon()顯示你的彈出菜單。讓我們研究一個小例子:

import org.jdesktop.jdic.tray.*;

import java.awt.event.*;

import javax.swing.*;

public class SystemTrayTest {

public static JMenuItem quit;

public SystemTrayTest() {

JPopupMenu menu = new JPopupMenu("My Menu");

menu.add(new JMenuItem("Test 1"));

menu.add(new JMenuItem("Test 2"));

quit = new JMenuItem("Quit");

quit.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) {

System.exit(0);

}});

menu.add(quit);

ImageIcon icon = new ImageIcon("duke.gif");

TrayIcon tray_icon = new TrayIcon(icon, "System Tray Test!", menu);

SystemTray tray = SystemTray.getDefaultSystemTray();

tray.addTrayIcon(tray_icon);

}

public static void main(String[] args) {

new SystemTrayTest();

}

}

在SystemTrayTest構造函數的前邊的幾行我們用三個菜單項建立了一個JpopupMenu。最後一個是quit,增加了一個 ActionListener用于退出程式。現在,除了把菜單添加到菜單條上和Jcomponent上外,我們把菜單放進了TrayIcon的構造函數裡。顯示系統托盤圖示的ImageIcon連同工具提示文字也傳進了TrayIcon裡。最後,我們把TrayIcon添加到預設的SystemTray 上,程式就完成了。把tray.jar和tray.dll分别放到類路徑和庫路徑中(通常是工作路徑)。

TrayAPI也支援動畫GIF圖示和左鍵動作。用這個API,你就能讓你的應用程式在你需要的時候才顯示在任務條上。

孵化器項目

從一開始,JDIC設計的目的是積極鼓勵和開發新的API。為了友善項目的成長,他們建立了孵化器項目,在那裡開發人員可以送出他們的代碼和試驗他們的想法。如果他們的想法不錯并實作成熟,項目就可以提升為一個完全的JDIC子產品甚至發展成為一個新的項目。

SaverBeans SDK

我過去保留我最喜愛的API。現在,JDIC有一個主要的孵化器項目:一個叫做SaverBeans的建立交差平台屏保的工具包。象其他JDIC一樣,你可以用Java做全部編碼,讓預建好的本地庫處理大量的細節。該項目由處理回調的API,一個用于配置的 xml檔案,和一個用平台支援檔案産生平台相關螢幕保護可執行程式(在Windows上是.scr,在Unix上是shell腳本)的Ant任務組成。

寫一個屏保要比用其他的API更複雜些,是以我把這部分放在本系列中的第二部分加以描述。

assoc.addAction(action);

AssociationService svc = new AssociationService();

svc.registerUserAssociation(assoc);

}

}

Main方法的前兩行建立了一個将會用notepad.exe打開檔案(用%1代替)的Action。之後的四行在action和擴充名為.mchat的檔案之間建立了關聯。在過去,大多數作業系統專門依賴于檔案擴充名或者所有的中繼資料來确定檔案類型。然而在今天,大多數作業系統傾向于為所有檔案設定MIME,是以,現在開始使用它是有益的。最後兩行實際上是在系統上注冊關聯。在使用所有的JDIC API時,隻要本地庫在你的庫路徑上,讓它工作起來你不需要做任何特别的事情。