提要:本文將以具體的執行個體向你展示Java SE 6在案頭開發中所提供的一系列優秀特徵。
一、 引言
隨著Java SE 6 Beta的發行,Java開發人員再也不需要自己去實現Java本機介面(JNI)便可以在其應用程式中加入案頭產品所具有的特徵。這些案頭整合特徵現在已成為核心的一個組成部分。
最新的Java標準版本6.0(代碼名為Mustang)將在功能上進行一系列的改進--開發人員們能夠方便地用Java處理安全,JMX,作業系統檔案,國際化和案頭開發等一系列問題。Sun在開發這個版本的過程中表現出非常積極的合作態度。他們通過JSR 270仔細地傾聽開發人員的意見並且在2006年2月早些時候就發行了所有的Java SE源碼和二進位代碼。看來,Sun正在傾力打造全新的案頭開發工具。
相對於以前的Java版本,Mustang的案頭整合能力特別受Java開發人員歡迎。這些新特徵把很多有趣的功能加入到Java傳統型應用程式的開發中。以前,開發例如Internet Explorer,系統托盤和郵件用戶端等Java時,開發人員必須在建立如Jtray和SysTray等Java本機介面(JNI)方面大傷腦筋。儘管這種"補丁"方案能夠實現既定目的,但是絕大部分的Java開發人員都非常盼望這些特徵成為核心Java平台的一部分。
本文將詳細分析一個應用程式範例GoMustang的建立過程。從中,我將向你展示如何使用Java SE 6在應用程式啟動時顯示一個Splash螢幕,怎樣建立系統托盤,以及怎樣從Java內部啟動本機案頭互連網瀏覽器。
注意,為調試本文中的樣本程式,你需要安裝:
Java Standard Edition 6 Beta和
Apache Ant 1.6.5。
二、 開發環境
(一) 準備Java SE 6 Beta
首先,你要從Sun的Java網站下載Java SE 6 Beta。因為Sun已經確定將在2006年的秋天正式發行Java SE 6,而且據JSR 270專家組的建議其中的一些特徵還將會作適當的改變;因此,目前在你的案頭開發中試用Mustang正是時候。
估計,最終本文中所描述的特徵不會出現多大變化;所以你可以放心使用JDK,JRE等的最新下載版本。
首先,請確保你的案頭平台被支援。我在Windows XP上開發與測試了本文的應用程式範例,且毫無問題。
其次,還要確保你的電腦的Windows系統屬性中的環境變數指向Java SE 6.0 JDK。我把JAVA_HOME環境變數設定為JAVA_HOME=C:\Program Files\Java\jdk1.6.0。
一旦安裝完成,你應該立即檢查Java JRE的版本。如果一切順利,應該顯示類似下面的一條訊息:
C:\java\mustang> java -version
java version "1.6.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.6.0-beta-b59g)
Java HotSpot(TM) Client VM (build 1.6.0-beta-b59g,mixed mode,sharing)
(二) 準備Ant
在本文中,你將使用Apache Ant來構建應用程式範例。因此,如果你還沒有這個工具,你可以從Apache網站下載並把它安裝到你的電腦上。
然後,你可以使用Ant屬性來檢查Ant Java版本。下列的例子顯示了一個不正確的Java版本:
${ant.java.version}
這是因為Ant內建的ant.java.version系統屬性被設計僅擁有1.1,1.2,1.3,1.4和1.5這幾個值。估計,Ant開發小組可能很快就會更新這個屬性以包含1.6;但是,當你想自己實現這一點時要特別小心。
為了謹慎起見,你可以使用-debug參數來運行Ant。如果顯示如下內容,則說明Ant實際上在使用一個1.6版本的JRE:
>>
Detected Java version: 1.5 in: C:\Program Files\Java\jdk1.6.0\jre
<<
(三) 安裝你的開發環境
接下來,安裝你的開發環境。為此,最簡單的方法是下載本文相應的源碼並解壓。如果你把ZIP檔案解壓到你的C:\路徑下,那麼你會看到如下結構的檔案和目錄:
c:\mustang\
|_build.xml
+_src
後面,你將使用Ant構建檔案build.xml來實現複製,編譯,構建,打包和運行GoMustang應用程式範例。該檔案包含下列幾個關鍵的Ant目標:
[init]
[clean]
[compile]
[dist]
[run]
這裡,[init]目標負責建立檔案夾結構並且把檔案拷貝到build檔案夾;[compile]實現編譯,而[dist]通過使用一個Manifest檔案來建立一個JAR(後面將詳細討論)。[run]目標負責啟動你的應用程式,而[clean]將協助你首先刪除所有的由Ant任務所建立的檔案和目錄,然後從一個完全乾淨的環境開始下面的任務。
src目錄包含3個檔案:一個GoMustang.java(源碼檔案)和兩個GIF檔案(gomustang-splash.gif用作Splash螢幕,gomustang.gif用作系統托盤中的表徵圖)。
現在,你已經打好了基礎。下面,我們開始建立你的應用程式的Splash螢幕。
三、 Splash螢幕
對基於案頭的應用程式來說,Splash螢幕一直在應用程式的啟動過程中起著關鍵作用。一個醒目的Splash螢幕能使使用者熱切地盼望應用程式的啟動--通過顯示行銷廣告,特定的法律條文,專業圖象,等等。同時,它還提供給應用程式一定的時間周期以裝載要求的庫檔案。
在Java應用程式開發中,實現Splash螢幕一直是一種挑戰性編程,因為在JVM啟動和所有要求的JRE和應用程式庫被裝載前程式無法取得控制權。而等到一個Java應用程式得到控制線程的機會時,顯示一個Splash螢幕已經太晚了。
Java SE 6甚至允許一個應用程式在JVM啟動前就可以顯示一個Splash螢幕。這項功能被構建於Java應用程式啟動器中--由它負責在一個未經修飾的視窗中顯示一幅映像。它允許使用GIF,PNG或JPEG圖象,可以是透明性或半透明的,並且可以存在動畫效果。而且,Java SE 6發行中還帶有一個SplashScreen類--它允許一旦應用程式控制線程,該程式就可以操作Splash螢幕。
你可以用下面兩種方式之一來啟動一個Splash螢幕:
1. 在一個JAR的Manifest檔案中指定一個具體的SplashScreen-Image屬性;
2. 使用一個命令列-splash參數。
(一) 使用JAR的Manifest屬性
本文下載源碼中的JAR檔案包含了一個gomustang-splash.gif檔案(此檔案在應用程式啟動時顯示一個Splash螢幕)和編譯類檔案GoMustang.class。這個JAR檔案的Manifest包含定義main()方法的類的名字和SplashScreen-Image屬性(它指向gomustang-splash.gif檔案)。
下面的列表展示了Ant build.xml JAR任務的內容--其中指定了main-class和SplashScreen-Image屬性:
...
<jar jarfile="${dist}/GoMustang.jar" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="GoMustang"/>
<attribute name="SplashScreen-Image" value="gomustang-splash.gif"/>
</manifest>
</jar>
...
為了看清Splash螢幕的真正運行,你可以通過在命令提示字元上輸入ant run來執行build.xml的[run]目標。因該程式很小,所以Java應用程式會在人眼能看見它之前完成開啟和關閉操作。為此,你可以使用暫停3秒的編碼小技巧。
一旦運行run目標,Ant應該會輸出如圖1所示的控制台跟蹤資訊,然後暫停3秒,此間使用者會看到Splash螢幕中的gomustang-splash.gif圖片。
圖1.Ant暫停
3秒後,Ant指令碼完成應用程式的建立,見圖2。
圖2.Ant指令碼完成系統托盤的建立
一個表徵圖將在系統托盤中被建立,由圖3所示。
圖3.GoMustang表徵圖
(二) 使用命令列-splash參數
顯示一個splash螢幕的第二種方法是,使用-splash命令列參數傳遞splash螢幕檔案名稱,如下所示
C:\mustang\build> java -splash:gomustang-splash.gif GoMustang
注意,為了使該命令正常運行,你需要從c:\mustang\build目錄(編譯class檔案和splash螢幕GIF檔案所在的位置)下使用Java的命令列方式。這些檔案都是由Ant中的build.xml檔案中的任務所建立。
一旦應用程式獲得一個線程的存取許可權,你就可以使用java.awt.SplashScreen類通過編程存取Splash螢幕。這是一個singleton類,它提供專門的函數來改變Splash螢幕映像,檢索Splash螢幕的大小和界限,操作有關繪圖物件,並最後關閉Splash螢幕。
四、 GoMustang.java檔案
在繼續之前,你應該先熟悉一下GoMustang.java檔案。這個檔案定義一個單個的Java類GoMustang,並且包含下列兩個關鍵函數:
· main
· createTrayIcon()
你可能已經猜出,main是主要的進入點-你可以存取java.awt.SplashScreen Java類以操作Splash螢幕。在GoMustang應用程式中,你可以使它暫停幾秒,然後通過調用splashScreen.close()來關閉Splash螢幕。然而,你可以在關閉它之前來操作該Splash螢幕。
createTrayIcon()類是這兩個函數中更為令人激動的。它負責實現所有的有趣的工作來安裝應用程式。這又涉及到我們將要討論的另一個主題:系統托盤表徵圖。
五、 系統托盤表徵圖
系統托盤位於Windows的任務狀態區或位於Gnome的通知區。它是在一個作業系統的案頭UI的角落的一個很小的地區,能提供到當前啟動並執行應用程式的可視化和直接的存取。本文所提供的Windows平台上的GoMustang應用程式能夠實現當右擊系統托盤表徵圖時產生一個快顯功能表(見圖4)。
圖4.在系統托盤上的GoMustang的快顯功能表
該GoMustang應用程式SystemTray有一個快顯功能表。菜單有兩個功能表項目:"Exit"和"Launch Browser"。"Exit"負責退出應用程式,而"Launch Browser"負責開啟預設的互連網瀏覽器並使其指向http://www.devx.com。
在過去,建立能夠靈活控制作業系統的案頭系統托盤的Java應用程式需要不是Java核心部分的庫的支援。為此,產生了JDIC(Java案頭整合組件),而且Sun決定把JDIC的一些組件作為Java SE 6的一部分一同發行。相關的類java.awt.SystemTray和java.awt.Desktop描述了這些關鍵組件。其中,Java.awt.SystemTray描述作業系統的任務狀態區或通知區。
顯示在系統托盤中的表徵圖是由java.awt.TrayIcon描述的。TrayIcon不僅描述映像而且還描述接收事件的實際對象,並負責顯示提示資訊,添加快顯功能表項,顯示訊息,等等。你可以通過displayMessage(String)和setToolTip(String)函數來設定TrayIcon上的訊息和提示資訊。TrayIcon還能把ActionEvents轉寄到經由Trayicon的addActionListener(ActionListener)函數註冊的ActionListener。快顯功能表是由java.awt.PopupMenu描述的,而且你可以通過addPopupMenu(PopupMenu)函數把它們添加到TrayIcon。
下面,讓我們剖析一下GoMustang Java類的createTrayIcon()函數。正如在列表1(見所附源碼)中的GoMustang代碼的詳細注釋所表明的:首先,你要調用SystemTray.isSupported()函數來檢查是否作業系統支援最小SystemTray功能;如果支援的話,這個函數應該返回true。
一旦程式知道作業系統支援系統托盤功能,它就建立Exit和Launch Browser功能表項目,而且把這些功能表項目加到快顯功能表中。當使用者右擊系統托盤的表徵圖時,這個菜單就會彈出。ActionListeners函數被加到Exit和Launch Browser功能表項目上。當使用者選擇這些功能表項目時,actionPerformed(ActionEvent)將給程式一個機會執行某種動作。這對於Exit功能表項目來說是通過執行System.exit(0)命令而退出應用程式;而對於Launch Browser功能表項目來說是通過指向http://www.devx.com而啟動預設的瀏覽器。注意,啟動瀏覽器需要使用新的java.awt.Desktop對象(稍後再討論)。
然後,應用程式建立一個快顯功能表對象並且把Exit和Launch Browser功能表項目添加到快顯功能表。下一步是用一個奔馬映像建立托盤表徵圖。你可以使用getClass().getResourceAsStream(file name)函數存取本文下載源碼中的gomustang.gif檔案並把它載入到一個映像對象中。然後,托盤表徵圖對象就可以與快顯功能表一同建立;Action和滑鼠聽取器也被關聯到托盤表徵圖上--對於本文常式來說,只顯示一條訊息。托盤表徵圖最後被添加到系統托盤上。系統托盤是一個singleton對象,它可以通過SystemTray對象的getSystemTray()函數加以檢索。在系統托盤上建立托盤表徵圖的完整過程就是這樣。
現在,讓我們更詳細地看一下"Launch Browser"功能表項目是如何啟動瀏覽器的。你可以分析相應於"Launch Browser"功能表項目的函數actionPerformed(ActionEvent)"來查看如何使用案頭對象。請參考下面代碼(列表2的一部分):
...
MenuItem launchBrowserItem = new MenuItem("Launch Browser");
ActionListener launchListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (Desktop.isDesktopSupported()) {
actionMessage = "Launched Browser";
try{
trayIcon.displayMessage("GoMustang!",
"Launching Browser...", TrayIcon.MessageType.INFO);
Desktop desktop = Desktop.getDesktop();
desktop.browse(new URI("http://dev.yesky.com"));
trayIcon.setToolTip("GoMustang!");
}
catch(Exception exp){...}
}
}
};
launchBrowserItem.addActionListener(launchListener);
...
在列表2(見所附源碼)中最讓我們感興趣的關鍵對象是java.awt.Desktop類。這個Desktop類,如我們早些時候所提及的,來自JDIC。該Desktop類負責定位和運行作業系統特定的傳統型應用程式。預設的網際網路瀏覽器應用程式對應是Mozilla的FireFox;因此,在顯示訊息"Launching Browser..."以後,desktop.browse(URI)函數將開啟一個指向http://dev.yesky.com的視窗。
六、 小結
對於Java在案頭控制方面的開發來說,真正有趣的事情剛剛開始。我們真誠期盼在Java以後的發行版本中加入更多的案頭控制功能。