1. 引言?
??? JAVA是開發(fā)服務(wù)器,個(gè)人應(yīng)用,移動(dòng)設(shè)備的極好的技術(shù)。因?yàn)?a class="innerlink" href="http://ihrv.cn/tags/跨平臺" title="跨平臺" target="_blank">跨平臺的需要使得JAVA在服務(wù)器和移動(dòng)設(shè)備方面非常成功?,F(xiàn)在雖然在個(gè)人電腦方面還不是很令人滿意,但JAVA正在以比你想像還快的速度改進(jìn)著。在這篇論文中,我將分析JAVA將怎樣改變現(xiàn)在的桌面世界,然后展示用標(biāo)準(zhǔn)J2SE構(gòu)建的全功能看圖軟件。
.桌面系統(tǒng)和JAVA?
??? 現(xiàn)在主流的桌面平臺是:Windows,Mac和Linux。它們都不是完美的。Windows統(tǒng)治著桌面市場,有著大量的應(yīng)用軟件和開發(fā)者,但很多要花錢,并且存在安全漏洞;Linux有著安全基礎(chǔ),并且是開源的,但沒有Windows用起來那么順手;Mac非常好用,也不是像Windows那樣成為黑客攻擊的對象,但其硬件、軟件的選擇比Windows和Linux要受限制的多。公司和個(gè)人選擇操作系統(tǒng)是要考慮很多因素的:盡量低的價(jià)格,盡量高的安全性占第一位,這讓很多人轉(zhuǎn)向了Linux(比如中國的軍用平臺就只能用Linux)。友好的使用環(huán)境,大量的應(yīng)用軟件使得Windows仍然占用很大的市場份額。Mac有著忠實(shí)的用戶。日益健壯的Linux市場,還有Mac的中興使得它們都大力運(yùn)用JAVA技術(shù),以便成為更加重要得桌面系統(tǒng)。
.跨平臺支持?
??? JAVA能在所以相關(guān)平臺上運(yùn)行,如果哪個(gè)組織想不改變軟件的現(xiàn)有代碼就能跨平臺使用,那么JAVA就是最好得桌面開發(fā)平臺。也許用Microsoft得可視化開發(fā)工具創(chuàng)建.NET程序很輕松,但這會(huì)使你局限于Windows平臺。如果你用JAVA開發(fā)應(yīng)用程序,你不會(huì)因?yàn)榇a重構(gòu)引起麻煩。JAVA的GUI能夠在各種平臺上看起來一樣,也能根據(jù)需要模擬平臺樣式。JAVA的安全性也是有目共睹的,這省去了不少后期維護(hù)工作。Sun公司桌面系統(tǒng)的推出,JDK1.5的升級,這給了廣大的JAVA開發(fā)者一個(gè)很好的機(jī)遇和挑戰(zhàn)。隨著JAVA技術(shù)的不斷成熟和多種IDE軟件的出現(xiàn),開發(fā)出的JAVA應(yīng)用軟件會(huì)更友好,開發(fā)周期也會(huì)更短,維護(hù)也更為方便。
.成功典范?
????Borland公司的JBuilder開發(fā)環(huán)境;NetBean組織的NetBean,以及IBM公司的Ecllipse。這些都是大型的桌面開發(fā)軟件,還有很多跟廣大計(jì)算機(jī)用戶密切相關(guān)的軟件,如永中Office,JFtp,Robocode,JLGui等等。
2. 實(shí)例分析?
.項(xiàng)目描述?
???“中國眼” 是北信JAVA實(shí)驗(yàn)室用純JAVA語言寫成的、成功的看圖軟件。它運(yùn)用了JAVA天然的跨平臺特性;融合了XML,多線程,css,javascript等多種技術(shù);支持BMP,XMP,JPG,JPEG,GIF,PNG,PCX。并且有很強(qiáng)的安全性和穩(wěn)健性。軟件只有400多K,很方便在網(wǎng)上傳輸。運(yùn)行環(huán)境為J2SE1.4以上。軟件已經(jīng)在Windows 98,2000,XP,2003,Linux RedHat9 通過了測試。
??? 它具有看圖,圖片處理,格式轉(zhuǎn)換,文件管理等多種功能。能幻燈片放映,圖像渲染(柔化,銳化,亮化,暗化,浮雕化等),以極快速度縮放,重命名,屏幕取色,圖像翻轉(zhuǎn),圖像裁剪,創(chuàng)建"我的相冊簿",全屏看圖,支持鼠標(biāo)拖拽裝入圖片。
?? 說到圖像處理,也許有人會(huì)想到用JAI(Java Advanced Imaging),但這會(huì)使得那些沒有安裝這個(gè)包的人很被動(dòng),而且這個(gè)包處于β版,性能不穩(wěn)定,所以在該軟件中沒有用JAI。
?? “中國眼”的圖像處理速度,它的小巧,它的強(qiáng)大功能會(huì)給用戶留下深刻映象。并且它是免費(fèi)的。
圖一:“中國眼”的系統(tǒng)層次
??? 對于Swing主件的繪圖設(shè)置,最好用paintComponent,這樣能夠用缺省的雙緩沖機(jī)制。
圖二:“中國眼”的圖形顯示
??? 看圖軟件要是沒有幻燈片放映會(huì)很遜色的,而JAVA幻燈片放映的實(shí)現(xiàn)是離不開線程的,不過線程的開始停止用那些supend,或者是stop 是不安全的,所以在run里面用循環(huán)變量來控制是比較好的選擇,下面是SlideShow:
public class slideshow extends Thread{?
public void run(){?? ??
while(slideshowbegin==true)
?????????? try{ cycleloadImage(KeyEvent.VK_SPACE);
??????????? ??????? if(slideshowbegin==false) break;
??? ??????????????? Thread.sleep(2000);//停止2000ms}
??????????? catch(InterruptedException e) {System.out.println(e.toString());}
}}
??? 對圖像文件的處理少不了要存儲(chǔ)一些圖像信息,比如說你要?jiǎng)?chuàng)建個(gè)人相冊簿,那么少不了對圖像發(fā)生年代、背景的記述。Java于XML的結(jié)合使得這樣的這變得很容易處理。
public static Document createDomDocument(String imagepath,String description)
{?? Document doc=parseXmlFile()
Element element; //加入根節(jié)點(diǎn)元素
if(doc.hasChildNodes()){element=doc.ge tDocumentElement();}
else{
element = doc.createElement("Description");
doc.appendChild(element);
Comment comment = doc.createComment("以下是各個(gè)圖像的描述信息");
//對元素節(jié)點(diǎn)插入comment
doc.insertBefore(comment, element);
}
String xpath = "http://*[@path='"+imagepath+"']";
try{? // 得到匹配的元素
NodeList nodelist = org.apache.xpath.XPathAPI.selectNodeList(doc, xpath);
//處理節(jié)點(diǎn)表中的元素
if(nodelist.getLength()!=0)element.removeChild((Element)nodelist.item(0));
}
catch(javax.xml.transform.TransformerExceptione){System.out.println(e.toString());}
Element imageinfo=doc.createElement("ImageInfo");//創(chuàng)建元素節(jié)點(diǎn)
element.appendChild(imageinfo);
imageinfo.setAttribute("path",imagepath);//設(shè)置元素屬性,用圖像路徑來表示
imageinfo.appendChild(doc.createTextNode(description));
return doc;
}
sun.awt.shell.ShellFolder sf= sun.awt.shell.ShellFolder.getShellFolder(file);
ImageIcon icon= new ImageIcon(sf.getIcon(true), sf.getFolderType());
得到文件的系統(tǒng)圖標(biāo),這樣就不會(huì)使人們在不同平臺下使用本軟件時(shí)感到陌生,這也是Java L&F的最好表達(dá)。
圖三:圖形的通用界面????????????????????? 圖四:圖形的柔化
??? 對應(yīng)每種圖像處理建立不同的處理類,都放在ImageProcess包下。圖形的柔化處理用了JAVA內(nèi)建的卷積類:
//一個(gè)圖像柔化就是把每一個(gè)象素和它周圍的8個(gè)象素平均
float weight = 1.0f/9.0f;
float[] elements = new float[9];
for (int i = 0; i < 9; i++)elements[i] = weight;
Kernel kernel = new Kernel(3, 3,elements);
BufferedImageOp op = new ConvolveOp(kernel);
3.總結(jié)和展望?
JAVA初衷是為在瀏覽器上運(yùn)行APPLET而創(chuàng)建的網(wǎng)絡(luò)技術(shù),但它通用有能力在桌面系統(tǒng)運(yùn)行的非常好,就那“中國眼”看圖軟件來說,經(jīng)過測試,縮放同樣的圖像,花費(fèi)的時(shí)間比ACDSee,以及IrfanView快的多,穩(wěn)定性好。不要忘了它還有最大的優(yōu)勢就是跨平臺的。這也是“Write Once, Run Anywhere”的最好應(yīng)證。
參考文獻(xiàn):
[1] java.sun.com
[2] http://www.onjava.com/pub/a/onjava
[3] http://community.java.net/javadesktop
[4] http://www-106.ibm.com/developerworks/java/
[5] Philip Brow? www.bolthole.com? n
[6] Matthias ?www.burgsoft.de