實(shí)例詳解NetBeans和Swing平臺(tái)開發(fā)
筆者和很早就開始使用 Java 的大多數(shù)人一樣,我最初接觸這項(xiàng)技術(shù)是使用(小型)桌面應(yīng)用程序的時(shí)候:它們是我讀博士期間的一些研究素材和一個(gè)衛(wèi)生保健呼叫中心的簡單控制面板。那時(shí)是 AWT 時(shí)代,能做的事有限。因此我很快就轉(zhuǎn)到了服務(wù)器這邊,這邊的系統(tǒng)似乎更強(qiáng)健、更有發(fā)展。事實(shí)確實(shí)如此。我在這次領(lǐng)域工作了很長時(shí)間,并且成為一名 J2EE 架構(gòu)師。
幾年之后,由于對(duì)數(shù)字?jǐn)z影熱情的不斷高漲,我又重新被吸引到桌面。我仍然遇到了許多問題,但是就在我即將放棄的時(shí)候,Sun 和開發(fā)人員社區(qū)推出的 SwingLabs、java.net 和新版本的 NetBeans 把我從困難中解救出來?,F(xiàn)在,我正在熱衷于使用一個(gè)(可能是)富有前途的開放源碼應(yīng)用程序 blueMarine,這個(gè)程序基于 NetBeans 平臺(tái)。
在本文中,我將告訴您有關(guān) blueMarine 的更多故事,并且回顧一些主要的 NetBeans 擴(kuò)展 API。我將介紹如何使用和自定義這些 API,同時(shí)指出我曾經(jīng)面臨的問題以及解決這些問題的方法。如果您對(duì)NetBeans和Swing知之甚少,而您又需要接觸各種各樣的客戶端應(yīng)用程序,我認(rèn)為您應(yīng)該好好閱讀這篇文章。
開始
2001 年前后,由于厭倦了使用 OpenOffice 電子表格,我***次編寫了一些 Java 代碼,用于管理我的照片。我將所有內(nèi)容導(dǎo)出到 XML 并且利用 XSLT 轉(zhuǎn)換,確定了我自己的數(shù)據(jù)庫格式,通過基于 Swing 的一個(gè)非常簡單的圖形用戶界面進(jìn)行管理。
在 2003 年夏天,我在數(shù)碼相機(jī)世界有了較大的飛躍,購買了 Nikon D100(專業(yè)的 SLR)。那個(gè)夏天是意大利本世紀(jì)最炎熱的夏天,因此我不得不***程度地減少拍照旅行的數(shù)量:外出散步也是受罪。我不得不待在家里,盡管托斯卡納鄉(xiāng)村的環(huán)境能令人放松,因此,大部分假期我都在學(xué)習(xí) NEF 格式。
當(dāng)時(shí),NEF 是一種“原始數(shù)據(jù)文件格式”,并且?guī)缀鯖]有公開。原始數(shù)據(jù)文件格式包含的數(shù)據(jù)直接來自于相機(jī) CCD 傳感器,未經(jīng)過處理。如果要將它轉(zhuǎn)換為質(zhì)量比較好的圖片,還需要對(duì)數(shù)據(jù)進(jìn)行處理。這通常認(rèn)為這一過程是舊式潮濕暗室相片成像的數(shù)字過程。我從來沒有擁有過自己的潮濕暗室,我為“數(shù)字沖洗”照片而入迷,開始為此編寫了一些 Java 代碼。
夏天快結(jié)束的時(shí)候,我創(chuàng)建了一個(gè)簡單的能夠顯示照片的微型導(dǎo)航程序—— blueMarine 就此誕生了。一年之后,這個(gè)項(xiàng)目便能夠用編錄設(shè)備標(biāo)記照片,并且能夠在網(wǎng)上發(fā)布圖片庫。
但是,讓我非??鄲赖氖?,我需要多個(gè)軟件來執(zhí)行編輯、打印、編錄、歸檔以及 Web 發(fā)布任務(wù)。因此我著手開始研究在一個(gè)應(yīng)用程序中實(shí)現(xiàn)所有這些工作流程。同時(shí),我認(rèn)為是時(shí)候公開發(fā)布 blueMarine 了,因此***個(gè) alpha 版本發(fā)布到了 GPL License(后來更改為 Apache 2.0)支持下的 SourceForge 。
另一個(gè)推動(dòng)力是在臺(tái)式計(jì)算機(jī)上挑戰(zhàn)使用 Java 對(duì)數(shù)字圖像進(jìn)行處理。對(duì)于我來說,Java 在科學(xué)圖像處理方面的優(yōu)勢已經(jīng)非常明顯;例如, NASA 的工程師們已經(jīng)成功使用了 JAI,它是一種高級(jí)成像的 API。但是,對(duì)于普通攝影師來說,桌面處理包含哪些內(nèi)容呢?自從成為 Java 顧問 10 多年來,證明 Java 在各種各樣的應(yīng)用程序方面的優(yōu)勢一直是我追求的目標(biāo)。
挫折
雖然開始時(shí)熱情高漲,但是在 2005 年底,我在這個(gè)項(xiàng)目上受到了很大的打擊。性能不是大問題,但是,在使用 plain Swing 開發(fā)豐富的 GUI 應(yīng)用程序時(shí),我遇到了困難。Swing 是一個(gè)非常出色的 API,但是當(dāng)您使用它構(gòu)建復(fù)雜的應(yīng)用程序時(shí),您會(huì)發(fā)現(xiàn)仍然需要增加很多功能。
實(shí)現(xiàn)這些缺少的部分并不是前言科學(xué),但是這項(xiàng)工作浪費(fèi)了很多寶貴的時(shí)間。再次舉例來說明這個(gè)問題,例如構(gòu)建菜單、以上下文相關(guān)的方式啟用操作、為內(nèi)部窗口定義靈活的、可在工作時(shí)停靠的機(jī)制等等,并且您將發(fā)現(xiàn)自己的大部分時(shí)間都花費(fèi)在編寫通用的 GUI 組件上,而沒有花費(fèi)在應(yīng)用程序的核心內(nèi)容上。
直到最近,才有了幾個(gè)處理此類問題的開放源碼庫,但是大部分庫都不太令人滿意,而且也很難集成。還有幾個(gè)較早版本的 NetBeans,但是我不滿意它們的性能。也可以選擇 Eclipse 和 SWT,但是我覺得我并沒有真正地仔細(xì)研究完全的替代方法和非標(biāo)準(zhǔn)的 API,我采用的學(xué)習(xí)投資回報(bào)低,繼承 Swing的方法比較麻煩。
總的來講,我認(rèn)真地考慮過放棄 blueMarine – 或許 Java 尚未準(zhǔn)備用于桌面開發(fā)。
新生
但是,同時(shí)出現(xiàn)了兩個(gè)事件使這個(gè)項(xiàng)目得以保留下來,這兩個(gè)事件是,我在 2005 年底參與了 JavaPolis 以及 2006 年初發(fā)布了 NetBeans 5.0。
在 JavaPolis,我呼吸到了我?guī)缀醵伎焱浀纳鐓^(qū)空氣(自從我上次參加JavaOne 已經(jīng)過去了三年)。這重新點(diǎn)燃了我的熱情,Romain Guy 的演示說明了使用 Swing 構(gòu)建 GUI 的效果如何,,這使我興趣倍增。我開始查看 Romain 的博客,并按照下面的鏈接訪問了其他人的博客,如 Joshua Marinacci 的博客,然后再從那里訪問所有 java.net 和 JavaDesktop 的站點(diǎn)。我發(fā)現(xiàn) Swing 里面有很多新鮮有趣的事;像 SwingLabs 里質(zhì)量優(yōu)良的 Swing組件和出眾的演示程序 – 很多材料我都能夠使用。但是,我仍然需要一個(gè)平臺(tái)。
幾周之后,推出了NetBeans 5.0 。這個(gè)新的版本看起來似乎最終解決了傳統(tǒng)的平臺(tái)問題,因此我決定試一試。我開始分解 blueMarine,只提取成像代碼并對(duì)該代碼重新設(shè)計(jì)以便使用 NetBeans 平臺(tái)。幾個(gè)月之后,便可以發(fā)布了***個(gè) Early Access 版本,我開始使用這個(gè)工具管理我自己的照片。同時(shí),從前一個(gè) PPC Apple iBook 切換到新的 Intel MacBook Pro 沒有出現(xiàn)任何問題則強(qiáng)有力地表明了我的選擇是正確的。
目前,我正致力于使新的 blueMarine 更穩(wěn)定、更便于使用。獲得了新的 early access 版本,并且我正在進(jìn)行所需的質(zhì)量測試(整個(gè)新設(shè)計(jì)明顯破壞了以前版本的一些穩(wěn)定性;這就是付出的代價(jià))。
NetBeans和Swing平臺(tái)的功能
由于您已經(jīng)了解了 blueMarine 的由來,因此我將概述一些NetBeans和Swing帶來的開發(fā)優(yōu)勢、我曾經(jīng)面臨的問題以及解決這些問題的方法。
***點(diǎn):是 Swing!
對(duì)于我來說,與很多競爭對(duì)手(如 Eclipse RCP)相比,NetBeans 平臺(tái)基于常規(guī)的Swing 是一個(gè)巨大的優(yōu)勢。搜索一下,您會(huì)發(fā)現(xiàn) Swing 組件(包括實(shí)現(xiàn)動(dòng)畫和效果比較酷的組件)有更廣闊的選擇余地。
去年 6 月份我非常具體地認(rèn)識(shí)到了這個(gè)優(yōu)勢,當(dāng)時(shí) Joshua Marinacci 發(fā)布了能夠顯示地圖的 Aerith Swing 組件的源代碼,命名為 JXMapViewer(Aerith 是 2006 年 JavaOne 上最熱門的演示程序)。幾周以來,我一直都在等待這個(gè)時(shí)刻,blueMarine 的其中一個(gè)功能是地理標(biāo)記(將地理位置與每個(gè)照片相關(guān)聯(lián),以便這些照片可以顯示在地圖上)。將 JXMapViewer 集成到 blueMarine 中只需要幾個(gè)小時(shí);
模塊系統(tǒng)
當(dāng)然,NetBeans 平臺(tái)應(yīng)用程序自然分為幾個(gè)模塊,實(shí)際上,它是一組綁定在一起的模塊。每個(gè)模塊都有一個(gè)名稱、一組版本標(biāo)記及其自己的類路徑以及一個(gè)聲明的依賴關(guān)系的列表。開 發(fā)人員可以控制哪些公共類的子集向其他模塊公開,其他模塊可以看到哪些公共類的子集,平臺(tái)可以在模塊之間施加依賴關(guān)系(例如,如果所需的模塊都不存在或者 太舊,則阻止模塊安裝)。
此外,通過發(fā)布新的模塊(放在 nbm 文件中)可以在以后擴(kuò)展應(yīng)用程序,用戶可以建立他們自己的“更新中心”,以便從 Internet 下載更新??梢詫?duì)各個(gè)模塊進(jìn)行數(shù)字簽名,系統(tǒng)會(huì)自動(dòng)彈出他們的許可證以便進(jìn)行批準(zhǔn)(如果需要的話)。
BueMarine 項(xiàng)目充分利用這個(gè)組織。該應(yīng)用程序的核心 API 由實(shí)現(xiàn)工作空間管理器、照片、縮略圖管理、簡單縮略圖和照片查看器的相對(duì)比較小的模塊集進(jìn)行定義。更多的高級(jí)功能(如編錄、圖庫管理器和地理標(biāo)記功能,包括地圖查看器)可以在單獨(dú)并且?guī)缀醪幌嚓P(guān)的模塊中實(shí)現(xiàn),這些模塊就作為核心 API 的“客戶端”。
DataObject、Node 和 ExplorerManager
ExplorerManager、Node 和 DataObject 可能是 NetBeans 中最有用的 API。使用 DataObject,您可以實(shí)現(xiàn)特定于應(yīng)用程序的實(shí)體,這些實(shí)體是映射到磁盤上的文件中。例如,blueMarine 的基本實(shí)體為 PhotoDataObject,它代表數(shù)據(jù)庫中的照片。
而 DataObject 包含實(shí)體的所有狀態(tài)和行為,為了進(jìn)行可視化可以將 Node 與DataObject綁定。還可以采用很多種不同的方式(如集合或圖形)將實(shí)體聚合在一起。NetBeans 平臺(tái)提供 GUI 組件,如表和列表,這些組件可以將一組 Node 對(duì)象用作其模型;最常見的組件是 BeanTreeView、ContextTreeView 和 ListView。***,ExplorerManager 控制選擇和樹導(dǎo)航。
是的,這只不過是一個(gè)復(fù)雜的 MVC 實(shí)現(xiàn),而且這個(gè)實(shí)現(xiàn)中已經(jīng)為您編寫了很多樣板文件代碼。例如,平臺(tái) API 考慮類似于拖放支持(以及拖放操作過程中類似于可視提示等詳細(xì)的細(xì)節(jié)信息)、剪切粘貼操作和上下文菜單的事情。
【編輯推薦】















 
 
 
 
 
 
 