轉(zhuǎn)帖|其它|編輯:郝浩|2011-07-26 14:40:42.000|閱讀 1928 次
概述:使用VC,VB或者C#的 開發(fā)者們對于在程序里面嵌入一個網(wǎng)頁來說,那真是小事一樁。但是在JAVA里面,卻幾乎是不可能實現(xiàn)的任務(wù)。 JEditorPane雖然說可以打開網(wǎng)頁,但是它那解析速度以及解析質(zhì)量,對于今天日益復(fù)雜的網(wǎng)頁內(nèi)容來說,就像沒有一樣。今天我們就使用一個開源的組 件(jdic)來實現(xiàn)在JAVA程序里面嵌入網(wǎng)頁的效率。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
使用VC,VB或者C#的 開發(fā)者們對于在程序里面嵌入一個網(wǎng)頁來說,那真是小事一樁。但是在JAVA里面,卻幾乎是不可能實現(xiàn)的任務(wù)。 JEditorPane雖然說可以打開網(wǎng)頁,但是它那解析速度以及解析質(zhì)量,對于今天日益復(fù)雜的網(wǎng)頁內(nèi)容來說,就像沒有一樣。今天我們就使用一個開源的組 件(jdic)來實現(xiàn)在JAVA程序里面嵌入網(wǎng)頁的效率。
下面言歸正轉(zhuǎn)吧,我們來介紹一下這個開源的組件,它的名字叫 JDIC(JDesktop Integration Components),它提供了一種訪問桌面組件的API,其中JDK6.0就采納了其中了一些,比如系統(tǒng)欄圖標的SystemTray和 SystemIcon,還有代表桌面的Desktop等等,可見這個API是挺不錯的。由于網(wǎng)頁瀏覽器的特殊性,標準的JDK并沒有把它加入進來,但是我 們一樣可以下載它來使用這個功能。明顯地,這個功能是用本地方法實現(xiàn)的,所以下載完以后,把 jdic.dll放到我們的path目錄中,比如system32文件夾下面,然后我們就可以使用它的功能從而增加我們的JAVA程序了。
如果你經(jīng)常訪問java.net,或者讀過JavaOne的新聞報道,你可能聽過 Jdesktop Integration Components(JDIC)。這些新的API終于能讓Java開發(fā)人員做那些我們曾經(jīng)羨慕本地同胞們所做的那些事情了。本文將給你一個有關(guān)JDIC 特性的全面介紹,每一個特性都帶有一個小例子,以及要邁出第一步該下載些什么的一個列表。除了SaverBeans子項目我們要在第二部分介紹外,我們將試驗所有的API
JDesktop Integration Components,或JDIC,是一個給Java開發(fā)人員提供通過交差平臺API存取本地特性的包羅萬象的項目。該項目由Sun的Desktop組啟 動,目的是讓Java應(yīng)用能更好地和它們所運行的桌面環(huán)境集成。為了能從開發(fā)人員那里得到想要的特性的快速反饋,他們將JDIC做成了開源項目。盡管目前 沒有計劃,但JDIC團隊正考慮把JDIC的特征加入Java核心類庫的未來版本中去
JDIC分為五個部分和一個孵化中的項目:
桌面:為了打開、編輯和用email郵寄文件來打開桌面程序;
文件類型:設(shè)置桌面文件類型關(guān)聯(lián);
瀏覽器:在AWT畫布上嵌入本地瀏覽器(Internet Explorer或者Mozilla);
包裝器:把Java Web Start程序轉(zhuǎn)換成本地安裝程序的命令行工具;
托盤API:支持系統(tǒng)托盤圖標和彈出式菜單;
SaverBeans:Java中的系統(tǒng)屏幕保護;
桌面組件
桌面組件是最簡單和可能是最有用的JDIC組件了。它專用于基本的桌面服務(wù),如在正確的編輯器里打開一個文件,新建一封 Email,或者把一個URL發(fā)送到默認的web瀏覽器。構(gòu)建這些東西需要做很多的工作,但使用起來卻非常容易。如果你想告訴操作系統(tǒng)打開一個Word文 檔,調(diào)用Desktop.open(new File(“resume.doc”));就可以了,就這么簡單。
Org.jdesktop.jdic.desktop包只有三個類:Desktop,Message和DesktopException。 Desktop類是靜態(tài)的不能被實例化。它有幾個打開、編輯和打印文件的方法。你也能打開一個新的email和用文本填充它。這就是Message使用的 地方,它能讓你設(shè)置接收人,郵件體,附件,和其他部分。
有關(guān)Desktop組件包最好的事就是它用起來是多么地簡單。你不需要注冊任何特殊的 驅(qū)動或者修改基于當(dāng)前平臺的配置。這些東西都已經(jīng)在幕后做好了。只要你的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
}
}
文件類型組件
JDIC的下一個核心組件是文件類型包,它用來設(shè)置文件類型關(guān)聯(lián)。這意味著你能告訴操作系統(tǒng)什么文件用什么程序打開,例如總是用Word打開文本文件而不是用寫字板打開。用這個API你能查詢、設(shè)置和刪除基于文件擴展名和mime類型的文件類型關(guān)聯(lián)。
假如那個文件類型通常是某種操作系統(tǒng)上特有的,檢索關(guān)聯(lián)或者注冊應(yīng)用本身而不是設(shè)置關(guān)聯(lián)時,這個API顯得更為有用。例如,在Windows下, 通常的文本文件的關(guān)聯(lián)是調(diào)用在眾所周知的目錄下的notepad.exe。在Gnome下,它可能調(diào)用/usr/local/bin/gedit。由于這 是和系統(tǒng)相關(guān)的,除了把java應(yīng)用綁定到自己文件的類型,設(shè)置關(guān)聯(lián)可能不是非常有用。盡管如此,不管你用它做什么,文件類型組件通過處理注冊表和 MIME 類型數(shù)據(jù)的方式為你處理了所有繁重的工作。
下邊是一個設(shè)置文件關(guān)聯(lián)的簡短的例子:
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");
assoc.addAction(action);
AssociationService svc = new AssociationService();
svc.registerUserAssociation(assoc);
}
}
Main方法的前兩行創(chuàng)建了一個將會用notepad.exe打開文件(用%1代替)的Action。之后的四行在action和擴展名為.mchat 的文件之間創(chuàng)建了關(guān)聯(lián)。在過去,大多數(shù)操作系統(tǒng)專門依賴于文件擴展名或者所有的元數(shù)據(jù)來確定文件類型。然而在今天,大多數(shù)操作系統(tǒng)傾向于為所有文件設(shè)置 MIME,因此,現(xiàn)在開始使用它是有益的。最后兩行實際上是在系統(tǒng)上注冊關(guān)聯(lián)。在使用所有的JDIC API時,只要本地庫在你的庫路徑上,讓它工作起來你不需要做任何特別的事情。
瀏覽器組件
JDIC的第三個主要組件是瀏覽器組件。不象前邊的兩個,它們只是讓你存取系統(tǒng)服務(wù),這個組件給你了一個真正在圖形應(yīng)用里使用的 AWT器件。以前,你可以使用第三方的嵌入式組件或純java的瀏覽器,但JDIC讓你把用戶默認的web瀏覽器嵌入到你的應(yīng)用中,這些為我們創(chuàng)造了很多機會。現(xiàn)在寫一些有全面Web支持的RSS閱讀器變成了可能的事情。由于你不必把本地瀏覽器包含進你的應(yīng)用中,下載速度也更快了。
瀏覽器組件API可以讓你訪問幾個瀏覽器事件以及在歷史記錄上的控制(向前,后退,刷新)。未來修訂的API版本希望能提供更多存取瀏覽器和任意裝載的文檔的功能。
在你的應(yīng)用里使用瀏覽器組件實在是非常容易:
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
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方法的第一行創(chuàng)建了一個新的 WebBrowser,第二行設(shè)置了你想顯示的URL。其他的代碼創(chuàng)建了一個frame,把瀏覽器加入其中,并使得frame可見
記住 WebBrowser是個本地AWT組件,因此你可能陷入與Swing結(jié)合的困境。混合它們的兩個規(guī)則是 1)不要讓Swing和AWT組件重疊和 2)在你的菜單上調(diào)用setLightWeightPopupEnabled(false)否則它們將消失在瀏覽器組件后邊。
瀏覽器組件將立刻使用用戶的默認Web瀏覽器,它們通常是Internet Explorer或Mozilla。你不能象使用Jrex那樣把Mozilla的必須的部分和你的應(yīng)用綁在一起。這種做法可能在Windows上行得通,IE絕對是可以的,但在Linux上有更多的問題,因為它上邊的默認瀏覽器不一定是 Mozilla(例如,在KDE上它可能是Konquorer)。希望這些問題隨著項目的成熟能夠解決,但目前它對許多項目是很有用的。
包裝器組件
不象其他的JDIC,包裝器模塊不是API,而是把JNLP(Java Web Start)應(yīng)用轉(zhuǎn)換成本地安裝程序(Linux上是rpms,Solaris上是pkgs,Windows上是msis)的一組命令行工具。這不是說象 Jsmooth或JexePack那樣把你的應(yīng)用轉(zhuǎn)換成.exe;它僅僅為Web Start應(yīng)用提供點擊安裝的功能。在程序安裝之后,它將使用JNLP通過Internet更新自己,做Web Start應(yīng)用能做的所有的其他事情。
包裝器組件需要J2SE5.0和本地工具。對Windows而言,你需要安裝Microsoft的MSI SDK。一旦你的環(huán)境建立了起來,就能使用命令行工具jnlp2msi,jnlp2rpm,和jnlp2pkg把你的Web Start應(yīng)用轉(zhuǎn)換成與平臺相關(guān)的安裝程序。
系統(tǒng)托盤
托盤圖標API曾是一個孵化中項目,但 由于java.net社區(qū)的勤奮努力,它已經(jīng)成熟并把它提升到一個完全的JDIC組件的地位。假如你的操作系統(tǒng)有托盤的概念的話,它的目的是在屏幕的右下 角創(chuàng)建小程序狀態(tài)圖標。實際上,這種操作系統(tǒng)是指Windows和Linux。Mac OS X用戶則沒有這個運氣。它也支持彈出菜單和為圖標提供自動工具提示。象其他JDIC一樣,系統(tǒng)托盤支持需要本地代碼,但你可以用Java API編碼來使用預(yù)編譯的本地庫。
由于這個API使用范圍非常小,所以它們只有兩個類: SystemTray和TrayIcon。SystemTray類有一個靜態(tài)工廠方法用于存取系統(tǒng)的默認托盤。TrayIcon讓你把一個 JpopupMenu和Icon添加到系統(tǒng)托盤的下一個可用的位置上。最后,調(diào)用 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構(gòu)造函數(shù)的前邊的幾行我們用三個菜單項創(chuàng)建了一個JpopupMenu。最后一個是quit,增加了一個 ActionListener用于退出程序。現(xiàn)在,除了把菜單添加到菜單條上和Jcomponent上外,我們把菜單放進了TrayIcon的構(gòu)造函數(shù) 里。顯示系統(tǒng)托盤圖標的ImageIcon連同工具提示文字也傳進了TrayIcon里。最后,我們把TrayIcon添加到默認的SystemTray 上,程序就完成了。把tray.jar和tray.dll分別放到類路徑和庫路徑中(通常是工作路徑)。
TrayAPI也支持動畫GIF圖標和左鍵動作。用這個API,你就能讓你的應(yīng)用程序在你需要的時候才顯示在任務(wù)條上。
孵化器項目
從一開始,JDIC設(shè)計的目的是積極鼓勵和開發(fā)新的API。為了方便項目的成長,他們創(chuàng)建了孵化器項目,在那里開發(fā)人員可以提交他們的代碼和試驗他們的想法。如果他們的想法不錯并實現(xiàn)成熟,項目就可以提升為一個完全的JDIC模塊甚至發(fā)展成為一個新的項目。
SaverBeans SDK
我過去保留我最喜愛的API。現(xiàn)在,JDIC有一個主要的孵化器項目:一個叫做SaverBeans的創(chuàng)建交差平臺屏保的工具包。象其他JDIC一樣, 你可以用Java做全部編碼,讓預(yù)建好的本地庫處理大量的細節(jié)。該項目由處理回調(diào)的API,一個用于配置的 xml文件,和一個用平臺支持文件產(chǎn)生平臺相關(guān)屏幕保護可執(zhí)行程序(在Windows上是.scr,在Unix上是shell腳本)的Ant任務(wù)組成。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載