




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1.1 簡(jiǎn)介1.1.1 Eclipse插件開(kāi)發(fā)簡(jiǎn)介插件的概念讀者應(yīng)該很熟悉,象MP3播放軟件WINAMP的皮膚插件、Windows Media Player的眾多的外觀插件、音效插件等等。但如果你以為插件只能做成為原軟件的邊角料,那是可以理解的,因?yàn)槟氵€沒(méi)有看到過(guò)Eclipse的插件是什么樣的。Eclipse可以全面更新你對(duì)插件的概念,它也是對(duì)插件概念運(yùn)用得最徹底最爐火純青的一個(gè)軟件。 在第一章我們就介紹了Eclipse的技術(shù)特點(diǎn),Eclipse的內(nèi)核很小,其他功能都是基于這個(gè)內(nèi)核上的插件,如Eclipse自帶的UNIT、ANT等。而且Eclipse還開(kāi)放了自己的插件機(jī)制,并提供了很好的插件開(kāi)
2、發(fā)環(huán)境,讓用戶可以自己來(lái)開(kāi)發(fā)Eclipse的插件。想知道開(kāi)發(fā)Eclipse的插件能到什么程度嗎?看看這些Eclipse上的插件吧:用于UML建模的Together for Eclipse、用于JSP的MyEclipse和Lomboz、IBM的全能開(kāi)發(fā)工具WSAD等等,它們?nèi)荅clipse的插件。如果微軟愿意,也可以把Office軟件做成Eclipse的插件。如果Adobe有興趣,Photoshop也可以有for Eclipse的插件版,Eclipse中的API Draw2D的繪圖功能也是很功的。 Eclipse的各式插件正如雨后春筍般不斷冒出,Eclipse已經(jīng)超越了開(kāi)發(fā)環(huán)境的概念,它的目標(biāo)
3、是做成一個(gè)通用的平臺(tái),讓盡量多的軟件做為插件集成在上面,成為未來(lái)的集成的桌面環(huán)境。同樣我們可以將我們的應(yīng)用系統(tǒng)寫(xiě)成Eclipse插件,筆者就在2004年參與開(kāi)發(fā)了一個(gè)項(xiàng)目管理軟件,該軟件就是以Eclipse的插件形式開(kāi)發(fā)的。 1.1.2 Eclipse插件開(kāi)發(fā)的優(yōu)勢(shì)和不足那么將軟件寫(xiě)成插件有什么好處呢?對(duì)于用戶來(lái)說(shuō)Eclipse的使用環(huán)境比較友好,前面介紹的SWT/JFace中還是比較基本的界面元素,象Eclipse中的視圖、編輯窗、停泊窗這些界面如果實(shí)現(xiàn)呢?如果用Appliction的方式會(huì)很麻煩,如果寫(xiě)成Eclipse插件則實(shí)現(xiàn)這些界面風(fēng)格不會(huì)吹灰之力??梢哉f(shuō)把軟件開(kāi)發(fā)成Eclipse插件
4、的最大好處就是界面風(fēng)格友好統(tǒng)一,如果用戶較熟悉Eclipse操作的話這種優(yōu)勢(shì)就更明顯。 當(dāng)然將軟件寫(xiě)成插件形式也有一定的缺陷。首先插件必須依附Eclipse,如果要安裝插件就得先安裝Eclipse。其次,插件和Eclipse融合在一起,原Eclipse的一些菜單和工具欄是無(wú)法完全屏蔽的。 1.2 插件的Hello World1.2.1 使用向?qū)б徊讲絼?chuàng)建HelloWorld我們利用Eclipse的“新建”向?qū)?lái)創(chuàng)建一個(gè)簡(jiǎn)單的插件。 1、 新建一個(gè)插件項(xiàng)目 (1)選擇主菜單“文件新建項(xiàng)目”,在彈出的窗口中(如圖5.1所示)選擇“插件開(kāi)發(fā)”下的“插件項(xiàng)目”,然后單擊“下一步”。 圖5.1 項(xiàng)目類(lèi)型
5、選擇 (2)如圖5.2所示,輸入項(xiàng)目名“myplugin”,其他設(shè)置不變,然后單擊“下一步”。 圖5.2 項(xiàng)目名稱(chēng) (3)在新顯示的窗口中接受所有缺省值不變,直接單擊“下一步”,這時(shí)將顯示模板選擇窗口(如圖5.3所示)。勾選“使用其中一個(gè)模板來(lái)創(chuàng)建插件”項(xiàng),然后選擇模板“Hello,World”項(xiàng)。最后單擊“完成”結(jié)束向?qū)?duì)話框。 圖5.3 模板選擇窗口 2、 插件項(xiàng)目myplugin簡(jiǎn)介 如果在新建項(xiàng)目中操作正確,Eclipse將顯示如圖5.4所示界面。 圖5.4 建立一個(gè)插件項(xiàng)目后的Eclipse界面 界面的左邊視圖中多了一個(gè)名為“myplugin”的項(xiàng)目。項(xiàng)目中有兩個(gè)文件:Myplugi
6、nPlugin.java、SampleAction.java。MypluginPlugin.java較重要,今后將會(huì)使用到它,而SampleAction.java則是一個(gè)類(lèi)似JFace中的Action,可以把它看做是插件中的Action,等會(huì)運(yùn)行時(shí)我們將看到SampleAction.java的效果。 項(xiàng)目根目錄下還有一個(gè)非常重要文件的plugin.xml,這個(gè)文件是插件的入口文件,Eclipse是根據(jù)這個(gè)文件里的設(shè)置信息來(lái)加載插件的。在插件開(kāi)發(fā)初期會(huì)頻繁在這個(gè)文件中做編輯,術(shù)語(yǔ)叫“設(shè)置擴(kuò)展點(diǎn)”。象在Eclipse的增加主菜單、視圖、按鈕等,都是在這個(gè)文件里面設(shè)置不同的擴(kuò)展點(diǎn),后面的將詳細(xì)講到如
7、何編輯此文件。有人會(huì)問(wèn):開(kāi)發(fā)一個(gè)系統(tǒng)會(huì)有很多的菜單和按鈕,是不是都要在這個(gè)文件里設(shè)置呢?回答:不必。在plugin.xml里只設(shè)置和Eclipse接壤的主要擴(kuò)展點(diǎn),其他軟件自有的菜單和按鈕不用在plugin.xml設(shè)置了。圖5.4的Eclipse界面中部顯示的就是plugin.xml的設(shè)置窗口,單擊該窗口下部的plugin.xml項(xiàng)后(如圖5.5所示),就可以直接編輯此文件。 圖5.5 plugin.xml編輯窗下部的選項(xiàng)條 3、 運(yùn)行插件 如圖5.6所示,選擇主菜單“運(yùn)行運(yùn)行方式運(yùn)行工作平臺(tái)”,這種是專(zhuān)用是插件的運(yùn)行方式,它將打開(kāi)一個(gè)新的Eclipse環(huán)境,并同時(shí)將插件項(xiàng)目編譯加載到新的Ec
8、lipse環(huán)境中。今后開(kāi)發(fā)經(jīng)常要通過(guò)這個(gè)方法來(lái)試運(yùn)行所開(kāi)發(fā)的插件項(xiàng)目,不過(guò)那時(shí)候選擇“運(yùn)行調(diào)試方式運(yùn)行工作平臺(tái)”以調(diào)試方式來(lái)運(yùn)行插件會(huì)比較多,Eclipse支持調(diào)試期間的熱修改,不用每次修改都新啟一個(gè)Eclipse,這樣能節(jié)省很多調(diào)試開(kāi)發(fā)時(shí)間。 新開(kāi)的Eclipse界面如圖5.6所示,在新的Eclipse環(huán)境中新增加了一個(gè)工具欄按鈕和一個(gè)主菜單項(xiàng)。單擊此按鈕或菜單項(xiàng),將彈出一個(gè)“Hello,Eclipse world”信息提示框。 圖5.6 myplugin插件運(yùn)行效果圖 4、 總結(jié) 本節(jié)里我們還只是依樣畫(huà)葫蘆,感覺(jué)有點(diǎn)云里霧里的吧。但不管怎么樣,第一個(gè)Eclipse插件已經(jīng)在我們手里誕生了,
9、下一節(jié)我們將不用HelloWorld模板來(lái)新建一個(gè)空白的插件項(xiàng)目,然后一步步的經(jīng)過(guò)手工實(shí)現(xiàn)這個(gè)Hello World插件項(xiàng)目所擁有的功能。 1.2.2 以空白項(xiàng)目為基礎(chǔ)手工創(chuàng)建HelloWorld1、 新建項(xiàng)目 按照上一節(jié)所講新建插件項(xiàng)目的方法,新建一個(gè)名為myplugin2的插件項(xiàng)目。注意在最后一步不要選擇任何模板,直接單擊“完成”結(jié)束向?qū)?duì)話框,除此之外的其他步驟都一樣。很幸運(yùn),Eclipse3.0修正了很多BUG,象以前用Eclipse2.X中文版時(shí),在這一步還會(huì)出很多庫(kù)引用的錯(cuò)誤,要很麻煩的一個(gè)個(gè)去修正。 2、 創(chuàng)建IWorkbenchWindowActionDelegate接口的實(shí)現(xiàn)
10、類(lèi) 新建一個(gè)包book.chapter_5,并將上一節(jié)中由HelloWorld模板生成的myplugin項(xiàng)目中的SampleAction.java文件復(fù)制到本項(xiàng)目中(Eclipse支持鼠標(biāo)拖拉操做)。然后對(duì)SampleAction做了一些小修改:刪除了無(wú)用的注釋和構(gòu)造函數(shù),修改了一下彈出框的提示文字,修改后的代碼如下: /* * 本類(lèi)相當(dāng)于插件的Action,要在Eclipse中增加主菜單或工具欄按鈕, * 就需要寫(xiě)一個(gè)實(shí)現(xiàn)IWorkbenchWindowActionDelegate接口的類(lèi) */ public class SampleAction implements IWorkbenchW
11、indowActionDelegate private IWorkbenchWindow window; public void run(IAction action) /打開(kāi)一個(gè)信息提示框 MessageDialog.openInformation(window.getShell(), Myplugin2插件, Hello,這是手工做的插件); public void selectionChanged(IAction action, ISelection selection) public void dispose() public void init(IWorkbenchWindow wi
12、ndow) this.window = window; 3、 原plugin.xml文件各設(shè)置項(xiàng)說(shuō)明 如圖5.7所示,將plugin.xml文件打開(kāi),并單擊窗口下的“plugin.xml”項(xiàng)轉(zhuǎn)到其代碼編輯窗。 圖5.7 plugin.xml的代碼編輯窗 項(xiàng)詳細(xì)介紹其中的各項(xiàng)設(shè)置如下: (1)項(xiàng) 說(shuō)明:是plugin.xml的主體。 lid 插件的唯一標(biāo)識(shí)。實(shí)際項(xiàng)目中一般加上包名或網(wǎng)址名來(lái)命名id,比如eclipse的tomcat插件是這樣命名的:org.eclipse.tomcat,這樣在世界上就不會(huì)有插件的標(biāo)識(shí)名和你重名了。以后在某些擴(kuò)展點(diǎn)中的屬性也會(huì)用到標(biāo)識(shí)符作為名稱(chēng)的前綴。 lname
13、插件的名稱(chēng),可以不唯一。 lversion 插件版本號(hào)。 lprovider-name 插件開(kāi)發(fā)商的名稱(chēng),可以寫(xiě)上作者或公司的名稱(chēng)。 lclass 插件類(lèi)的名稱(chēng),即插件項(xiàng)目自動(dòng)生成的MypluginPlugin2.java文件的類(lèi),前面加上包名。 (2)項(xiàng) 說(shuō)明:這里是聲明插件運(yùn)行時(shí)需要的jar包,比如插件要連接MySQL數(shù)據(jù)庫(kù)需要它的一個(gè)包,如下定義,其中“l(fā)ib”是該包所在路徑。其中本插件自身的jar包也要聲明,而且本插件在打包時(shí)將以myplugin2.jar為名打包。 (3)項(xiàng) 說(shuō)明:在requires域中定義了該插件所要使用的依賴插件?,F(xiàn)在兩項(xiàng)就夠了,隨著開(kāi)發(fā)的不斷深入這里將會(huì)添加更多
14、對(duì)其它插件的引用。如下是筆者的實(shí)際項(xiàng)目中的requires設(shè)置,它要用到draw2d和gef插件來(lái)畫(huà)圖、用于插件的幫助系統(tǒng)來(lái)創(chuàng)建建自己的幫助文檔。 4、為HelloWorld修改plugin.xml 將如下代碼加入到plugin.xml的“”行之后: 說(shuō)明: 在項(xiàng)設(shè)置要擴(kuò)展的擴(kuò)展點(diǎn),它是非常重要的一項(xiàng)。 l point=org.eclipse.ui.actionSets,設(shè)置了本插件的擴(kuò)展點(diǎn)為何,actionSets是指Eclipse的菜單、菜單項(xiàng)和工具欄按鈕的擴(kuò)展點(diǎn) l 項(xiàng)表示一個(gè)action組(菜單、按鈕)。label是顯示的名稱(chēng)。id其唯一標(biāo)識(shí)符,只要保證在本plugin.xml文件中不
15、存在重復(fù)的id就行了。visible指設(shè)置的按鈕或菜單是否顯示,如果設(shè)置成false,則不顯示。注意:要看visible設(shè)置的效果要將“透視圖”關(guān)掉再重新打開(kāi)。 l 是下的子項(xiàng),它表示在Eclipse中插入顯示一個(gè)名為“樣本菜單(M)”的主菜單。separator標(biāo)簽是一個(gè)結(jié)束符,它可以對(duì)菜單分組。 l 也是下的子項(xiàng),由它設(shè)置菜單、按鈕。icon是圖片的路徑,如果該圖片不存,默認(rèn)是一個(gè)紅色實(shí)心小框(Eclipse2.X)或不顯示圖片而顯示文字(Eclipse3.X)。Class是按鈕所對(duì)應(yīng)的類(lèi),注意包名也要加上。menubarPath表示把這個(gè)action做成一個(gè)菜單項(xiàng)放在上前定義的主菜單下。
16、toolbarPath表示把這個(gè)action再做成一個(gè)工具欄按鈕。id是標(biāo)識(shí)符,設(shè)置成和class項(xiàng)一樣的名稱(chēng)是個(gè)不錯(cuò)的選擇。 以上僅是Eclipse的擴(kuò)展點(diǎn)中的一種,此外還有其它的擴(kuò)展點(diǎn)共有一百多種之多。我們沒(méi)有必要了解所有擴(kuò)展點(diǎn)的設(shè)置,只須熟悉一些常用的擴(kuò)展點(diǎn)即可,如視圖的擴(kuò)展點(diǎn)org.eclipse.ui.views、編輯器的擴(kuò)展點(diǎn)org.eclipse.ui.editors等,本書(shū)將陸續(xù)給于介紹。另外,各種擴(kuò)展點(diǎn)在Eclipse的幫助中有詳細(xì)的說(shuō)明,其位置為:選擇主菜單“幫助幫助內(nèi)容”,然后打開(kāi)“平臺(tái)插件開(kāi)發(fā)指南參考擴(kuò)展點(diǎn)參考”項(xiàng)。 5、運(yùn)行插件 按上一節(jié)(5.2.1節(jié))所說(shuō)的方法運(yùn)行
17、插件(運(yùn)行之前不妨將上節(jié)所建的myplugin項(xiàng)目關(guān)閉掉,關(guān)閉方法:右鍵單擊myplugin項(xiàng)目名,然后在彈出菜單中選擇“關(guān)閉項(xiàng)目”)。myplugin2插件的效果如圖5.8所示 圖5.8 myplugin2插件運(yùn)行效果圖 5.3 常用插件擴(kuò)展點(diǎn)實(shí)戰(zhàn)(plugin.xml)在上一節(jié)(5.2.2節(jié))已經(jīng)對(duì)原有的plugin.xml做了很詳盡的介紹,plugin.xml是插件和Eclipse的接口,Eclipse就象一所大宅子,它的外墻(plugin.xml)有很多的門(mén)(擴(kuò)展點(diǎn)),我們要熟練進(jìn)出這座大宅子,先得搞清楚它有哪些門(mén),當(dāng)然我們只需要熟悉一些主要的門(mén)就足夠應(yīng)付90%的需求了。本節(jié)將以開(kāi)發(fā)需
18、求為導(dǎo)向來(lái)介紹這些擴(kuò)展點(diǎn),并且本節(jié)所有實(shí)例都在5.2.2節(jié)所建立的myplugin2項(xiàng)目的基礎(chǔ)上來(lái)進(jìn)行講解演示。5.3.1 加入透視圖(perspectives)往開(kāi)發(fā)一個(gè)插件,最常用的方式就是新增一個(gè)屬于本插件專(zhuān)有的透視圖,然后在此透視圖基礎(chǔ)上來(lái)展開(kāi)軟件開(kāi)發(fā),本書(shū)即采用這種方式。1、準(zhǔn)備工作我們先將以前用到的那些圖標(biāo)的icons目錄復(fù)制一份到myplugin2項(xiàng)目中,復(fù)制后的路徑如圖5.9所示:圖5.9 圖標(biāo)的路徑2、修改plugin.xml文件,設(shè)置透視圖的擴(kuò)展點(diǎn)打開(kāi)plugin.xml文件的編輯框,將如下代碼塊插入到最后一行的之前: 說(shuō)明:l org.eclipse.ui.perspec
19、tives是透視圖的擴(kuò)展點(diǎn)l name 透視圖的名稱(chēng)l icon 透視圖的圖標(biāo)l class 透視圖所對(duì)應(yīng)的類(lèi)(我們還沒(méi)編寫(xiě),下一步將完成此類(lèi))l id 透視圖標(biāo)識(shí),建議設(shè)置成和class一樣的名稱(chēng),省得以后擴(kuò)展點(diǎn)設(shè)置得太多,搞得人糊涂。3、建立透視圖類(lèi)在上一步的plugin.xml中提前設(shè)置了透視圖對(duì)應(yīng)的類(lèi)book.chapter_5.SamplePerspective,這一步我們就來(lái)在包book.chapter_5中創(chuàng)建此類(lèi)。透視圖的類(lèi)必須實(shí)現(xiàn)IPerspectiveFactory接口,此接口只有一個(gè)方法createInitialLayout,我們讓它先空實(shí)現(xiàn)好了。SamplePerspe
20、ctive代碼如下:/-文件名:SamplePerspective.java-public class SamplePerspective implements IPerspectiveFactory public void createInitialLayout(IPageLayout layout) 4、運(yùn)行插件按以前所說(shuō)的方法運(yùn)行插件后,在新開(kāi)的Eclipse環(huán)境中選擇主菜單“窗口打開(kāi)透視圖其它”。在彈出如圖5.10的透視圖選擇窗口中,我們可以看到一個(gè)名為“myplugin透視圖”的項(xiàng)。圖5.10 選擇透視圖選擇并打開(kāi)“myplugin透視圖”項(xiàng)后,顯示如圖5.11的Eclipse界面。
21、我們發(fā)現(xiàn)該透視圖光禿禿的什么也沒(méi)有。沒(méi)關(guān)系,我們下一小節(jié)就會(huì)往這個(gè)透視圖加入兩個(gè)視圖。圖5.10 myplugin透視圖的效果圖5、總結(jié)由本小節(jié)可以看到在Eclipse創(chuàng)建一個(gè)界面(菜單、按鈕、透視圖)是多么的簡(jiǎn)單,我們都不用編寫(xiě)實(shí)際界面的創(chuàng)建代碼,只要設(shè)置一些擴(kuò)展點(diǎn)就行了。第6章 SWT概述在這一章里將把SWT和AWT/SWING做了簡(jiǎn)單的比較,并以一個(gè)HelloWorld的Java應(yīng)用程序(Application)作為起步,讓讀者可以快速建立對(duì)SWT/JFace的感性認(rèn)識(shí)。在這一章里所有的例子都是以Java應(yīng)用程序方式來(lái)寫(xiě)的,之所以如此,是因?yàn)镴ava應(yīng)用程序代碼簡(jiǎn)潔,且可以獨(dú)立運(yùn)行,便于
22、講解和示范。當(dāng)然,這些例子的代碼方法同樣適用于Eclipse的插件開(kāi)發(fā),SWT/JFace在Java應(yīng)用程序和Eclipse插件開(kāi)發(fā)中的使用是沒(méi)有太多區(qū)別的。6.1 SWT簡(jiǎn)介2003年,筆者對(duì)SWT/JFace(英文全稱(chēng):Standard Widget Toolkit)還是僅有耳聞,知道在AWT/Swing之外,又有了一個(gè)新的圖形API包,聽(tīng)說(shuō)還很不錯(cuò),當(dāng)時(shí)書(shū)店里根本沒(méi)有相關(guān)資料,只能在網(wǎng)上找到一些零星的文章來(lái)了解。2004年前,筆者還極少用Java來(lái)寫(xiě)GUI程序(GUI全稱(chēng):Graphical User Interfaces,圖形用戶界面),主要的工作都是用JSP來(lái)寫(xiě)網(wǎng)頁(yè)。用JAVA來(lái)開(kāi)發(fā)
23、大型的GUI程序?qū)嵲诤芾щy的事,大都丑陋又笨重(慢),SUN在GUI方向上的失敗是公認(rèn)的事實(shí)。失敗關(guān)鍵之處在于Java的圖形API包AWT/SWING在速度和外觀上都不能讓人滿意,外觀總是和同操作系統(tǒng)平臺(tái)下的其他軟件格格不入,對(duì)機(jī)器配置的需求也似乎永無(wú)止境。2004年初,筆者有幸參與到一個(gè)用Eclipse插件方式來(lái)開(kāi)發(fā)的軟件項(xiàng)目中,該軟件使用到了SWT/JFace,那界面實(shí)在是太酷太漂亮了,讓人為之耳目一新,而且界面響應(yīng)速度極快,這真的是用Java開(kāi)發(fā)的嗎?當(dāng)時(shí)竟然有點(diǎn)不敢相信。無(wú)疑,SWT/JFace象一股清新的風(fēng)吹入了Java的GUI開(kāi)發(fā)領(lǐng)域,為這個(gè)沉悶的領(lǐng)域帶來(lái)了勃勃生機(jī)。雖然SUN不接
24、納SWT/JFace作為Java中的一種圖形API標(biāo)準(zhǔn),但它雖然借著Eclipse的優(yōu)異表現(xiàn),以不可阻擋之勢(shì)向前發(fā)展著。終于可以用SWT輕松的開(kāi)發(fā)出高效率的GUI程序,且擁有標(biāo)準(zhǔn)的Windows外觀,Eclipse軟件就是基于SWT/JFace構(gòu)建的,大家看看Eclipse3.0就知道SWT有多么的棒。圖6.1 SWT、JFace、GUI程序三者關(guān)系示意圖如上圖6.1,為了方便開(kāi)發(fā)SWT程序,在SWT基礎(chǔ)上又創(chuàng)建了一個(gè)更易用、功能強(qiáng)大的圖形包“JFace”。然而,JFace并不能完全覆蓋SWT的所有功能,所以編程時(shí)SWT、JFace都會(huì)要用到,但是一般來(lái)說(shuō),能用JFace的組件就最好不要用SW
25、T的。6.2 SWT中的包SWT是Eclipse圖形API的基礎(chǔ),本節(jié)將簡(jiǎn)單介紹一下SWT中所包含的子包。1、org.eclipse.swt.widgets最常用的組件基本都在此包中,如Button、Text、Label、Combo等。其中兩個(gè)最重要的組件當(dāng)數(shù)Shell和Composite:Shell相當(dāng)于應(yīng)用程序的主窗口;Composite相當(dāng)于SWING中的Panel對(duì)象,是容納組件的容器。2、org.eclipse.swt.layout主要的界面布局方式在此包中。SWT對(duì)組件的布局也采用了AWT/SWING中的Layout和Layout Data結(jié)合的方式。3、org.eclipse.s
26、wt.custom對(duì)一些基本圖形組件的擴(kuò)展在此包中,比如其中的CLabel就是對(duì)標(biāo)準(zhǔn)Label組件的擴(kuò)展,在CLabel上可以同時(shí)加入文字和圖片。在此包中還有一個(gè)新的布局方式StackLayout。4、org.eclipse.swt.eventSWT采用了和AWT/SWING一樣的事件模型,在包中可以找到事件監(jiān)聽(tīng)類(lèi)和相應(yīng)的事件對(duì)象。比如,鼠標(biāo)事件監(jiān)聽(tīng)器MouseListener,MouseMoveListener等,及對(duì)應(yīng)的事件對(duì)象MouseEvent。5、org.eclipse.swt.graphics此包中包含針對(duì)圖片、光標(biāo)、字體或繪圖API。比如,可通過(guò)Image類(lèi)調(diào)用系統(tǒng)中不同類(lèi)型的圖
27、片文件。6、org.eclipse.swt.ole.win32對(duì)不同平臺(tái),SWT有一些針對(duì)性的API。例如,在Windows平臺(tái),可以通過(guò)此包很容易的調(diào)用OLE組件,這使得SWT程序也可以內(nèi)嵌IE瀏覽器或Word、Excel等程序。此外還有org.eclipse.swt.dnd、org.eclipse.swt.printing、gram、org.eclipse.swt.accessibility、org.eclipse.swt.browser、org.eclipse.swt.awt等包,在此不一一介紹了。這些包一般很少用到,只需要稍微了解一下就行了,不必深
28、究。6.3 用SWT Designer寫(xiě)一個(gè)Hello WorldSWT Designer是優(yōu)秀的SWT/JFace開(kāi)發(fā)輔助工具,本書(shū)大都SWT/JFace的例子都是使用它來(lái)生成代碼后,再進(jìn)行修改而成。當(dāng)然,SWT Designer并非是閱讀和運(yùn)行這些例子的必須條件。本節(jié)將用SWT Designer來(lái)寫(xiě)出第一個(gè)基于SWT的HelloWorld程序,以此給讀者演示在開(kāi)發(fā)中是如何使用SWT Designer的。6.3.1 使用用向?qū)Ы⒁粋€(gè)SWT/JFace Java項(xiàng)目(1)選擇主菜單“文件新建項(xiàng)目”,彈出如下圖6.2所示窗口。圖6.2 新建項(xiàng)目窗口(2)選擇“Designer”下的“SWT/J
29、Face Java Project”項(xiàng),單擊“下一步”,彈出如下圖6.3所示窗口。圖6.3創(chuàng)建Java項(xiàng)目窗口(3)填寫(xiě)項(xiàng)目名稱(chēng)“myswt”,項(xiàng)目布局選擇第二個(gè),單擊“完成”。這時(shí)如果打開(kāi)“java”透視圖,可以看到多了一個(gè)名為“myswt”的項(xiàng)目,下方還排列著很多庫(kù)引用,如下圖6.4所示窗口。圖6.4 “java”透視圖注:(1)其實(shí)寫(xiě)SWT程序也不是一定要重新建立這樣一個(gè)新的項(xiàng)目,原來(lái)老的“myproject”項(xiàng)目依然可以繼續(xù)使用的,但必須將SWT、JFace包及一些相關(guān)的包引用到Java構(gòu)建路徑中,手工一步步做這個(gè)工作太過(guò)于繁鎖。有一個(gè)簡(jiǎn)單的方法:借助SWT Designer新建項(xiàng)目時(shí)
30、保存在.classpath文件中的庫(kù)引用,將其復(fù)制粘貼到myproject的.classpath中即可。(2)當(dāng)編寫(xiě)Java程序時(shí),筆者認(rèn)為“Java”透視圖要比默認(rèn)的“資源”透視圖好用,主要是因?yàn)榍罢叩陌@示不是樹(shù)狀的,用起來(lái)較方便。但選擇哪一種透視圖,還是要看各人的習(xí)慣和喜好。本書(shū)以后的所講內(nèi)容將統(tǒng)一使用“Java”透視圖。6.3.2 導(dǎo)入SWT的原生庫(kù)想要運(yùn)行Java應(yīng)用程序,必須將SWT的原生包導(dǎo)入到項(xiàng)目中,否則該項(xiàng)目在運(yùn)行程序時(shí)會(huì)報(bào)異?!癹ava.lang.UnsatisfiedLinkError: no swt-win32-3063 in java.library.path”,并彈
31、出圖6.5所示的錯(cuò)誤提示框。圖6.5 未導(dǎo)入SWT原生包時(shí)產(chǎn)生的錯(cuò)誤提示框?qū)隨WT原生包的步驟如下:(1)右鍵單擊項(xiàng)目名“myswt”,在彈出菜單中選擇“導(dǎo)入”,則會(huì)彈出如圖6.6所示窗口。圖6.6導(dǎo)入窗口(2)選擇“文件系統(tǒng)”后單擊“下一步”,轉(zhuǎn)到如圖6.7所示窗口圖6.7選擇導(dǎo)入文件(3)通過(guò)“瀏覽”按鈕找到SWT原生庫(kù)的路徑(也可以直接輸入路徑文字),路徑為“C:eclipsepluginsorg.eclipse.swt.win32_3.0.1oswin32x86”。然后將“swt-win32-3063.dll”選上,單擊“完成”,導(dǎo)入SWT原生包的設(shè)置結(jié)束。6.3.3 新建一個(gè)SWT
32、類(lèi)文件參閱“4.2節(jié) 創(chuàng)建Java項(xiàng)目并運(yùn)行”所講方法,新建一個(gè)類(lèi)文件。(1)在“Java”透視圖的“包資源管理器”中,右鍵單擊“com.swtdesigner”包,在彈出菜單中選擇“新建其他”,彈出如圖6.8所示窗口。圖6.8選擇新建的類(lèi)型(2)選擇“DesignerSWTApplication Window”,單擊“下一步”,彈出如圖6.9所示窗口。圖6.9類(lèi)文件的設(shè)置(3)類(lèi)的名稱(chēng)填“HelloWorld”,并選擇“Create contents in(類(lèi)代碼的生成方式)”為第三項(xiàng)“public static main() method”(第三項(xiàng)生成的代碼結(jié)構(gòu)最簡(jiǎn)單),彈擊“完成”。Ec
33、lipse將自動(dòng)生成HelloWorld.java的代碼,代碼如下(注釋為筆者手工加入):package com.swtdesigner; /包名import org.eclipse.swt.widgets.Display;/程序所用到的類(lèi)都會(huì)用import標(biāo)記在這里,import org.eclipse.swt.widgets.Shell; /import的快捷鍵 Ctrl+Shift+Opublic class HelloWorld /一個(gè)標(biāo)準(zhǔn)的Java類(lèi)HelloWorld public static void main(String args) /display負(fù)責(zé)管理事件循環(huán)和控制U
34、I線程和其他線程之間的通訊。 final Display display = Display.getDefault(); final Shell shell = new Shell(); / shell是程序的主窗口 shell.setSize(327, 253); /設(shè)置主窗口的大小 shell.setText(SWT Application); /設(shè)置主窗口的標(biāo)題 shell.layout(); /shell應(yīng)用界面布置 shell.open(); /打開(kāi)shell主窗口 while (!shell.isDisposed() /如果主窗口沒(méi)有關(guān)閉,則一直循環(huán) if (!display.re
35、adAndDispatch() /如果display不忙 display.sleep(); /display休眠 從這個(gè)代碼可以看到,創(chuàng)建一個(gè)典型的SWT應(yīng)用程序需要以下步驟:l 創(chuàng)建一個(gè)Displayl 創(chuàng)建一個(gè)或多個(gè)Shelll 設(shè)置Shell的布局(3.5節(jié)將講到布局的內(nèi)容)l 創(chuàng)建Shell中的的組件(注:本例還沒(méi)有加入組件,只是一個(gè)空窗口)l 用open()方法打開(kāi)Shell窗口l 寫(xiě)一個(gè)事件轉(zhuǎn)發(fā)循環(huán)l 銷(xiāo)毀display6.3.4 在主窗口加入一個(gè)文本框組件如果運(yùn)行HelloWorld.java,它還僅是一個(gè)空蕩蕩的主窗口。我們利用SWT Designer將一個(gè)SWT的文本框組件加
36、入到主窗口中,操作步驟如圖6.10所示。圖6.10 將文本框加入到主窗口的操作示意圖圖中所示的操作步驟用文字描述如下:(1)先將編輯器最大化。然后單擊Eclipse的左下角的“Design”選項(xiàng)頁(yè),則編輯器由代碼視圖變成設(shè)計(jì)視圖。(2)選擇SWT組件欄中“SWT Controls”分類(lèi)下的“Text”組件,然后在主窗口上單擊,將Text框放入。注意這里不是通常的將組件拖入到窗口。(3)轉(zhuǎn)到屬性窗口,在“text”項(xiàng)里填寫(xiě)“HelloWorld”。單擊Eclipse左下角的“Source”返回到編輯器的代碼視圖,代碼如下:package com.swtdesigner;import org.ec
37、lipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.SWT;import org.eclipse.swt.widgets.Text;public class HelloWorld public static void main(String args) final Display display = Display.getDefault(); final Shell shell = new Shell(); shell.setSize(327, 253); shell.set
38、Text(SWT Application); /-新插入的界面核心代碼- Text text = new Text(shell, SWT.BORDER); /新建一個(gè)text對(duì)象text.setText(HelloWorld); /給text文本框設(shè)置初始文字HelloWorld text.setBounds(88, 94, 100, 25); /設(shè)置文本框的位置和大小,(x軸坐標(biāo),y軸坐標(biāo),寬度,高度) /-END- shell.layout(); shell.open(); while (!shell.isDisposed() if (!display.readAndDispatch()
39、display.sleep(); 6.3.5 運(yùn)行HelloWorld.java選擇主菜單“運(yùn)行運(yùn)行方式Java應(yīng)用程序”,運(yùn)行界面如圖6.11所示:圖6.11 HelloWorld的第一次運(yùn)行界面以上的程序例子還是比較簡(jiǎn)單的,如圖6.12所示,給出一個(gè)稍微標(biāo)準(zhǔn)些的界面,并給出了各類(lèi)和界面之間的對(duì)應(yīng)關(guān)系。注:在SWT中check框(復(fù)選框)也是一種Button。圖6.12 界面和類(lèi)之間的對(duì)應(yīng)關(guān)系圖其中Display和Shell的譜系圖如圖6.13所示,Group和Button在3.3節(jié)有介紹。圖6.13 Display和Shell的譜系圖6.4 關(guān)于SWT/JFace例程的說(shuō)明由于SWT/JF
40、ace應(yīng)用程序例子的整體代碼結(jié)構(gòu)都基本一樣,如下:package com.swtdesigner;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.SWT;import org.eclipse.swt.widgets.Text;public class HelloWorld public static void main(String args) final Display display = Display.getDefault(); final
41、 Shell shell = new Shell(); shell.setSize(327, 253); shell.setText(SWT Application); /-新插入的界面核心代碼- /-END- shell.layout(); shell.open(); while (!shell.isDisposed() if (!display.readAndDispatch() display.sleep(); 為了節(jié)省篇幅,以后的例子一般都會(huì)省略上面代碼框架前后部份,只給出中間省略號(hào)處的核心代碼,要想得到完整的代碼請(qǐng)查閱本書(shū)隨書(shū)光盤(pán)中的例程。6.5 實(shí)踐建議SWT Designer還無(wú)
42、法完成所有的界面設(shè)計(jì)工作,所以在界面開(kāi)發(fā)中依然是以手工寫(xiě)代碼為主,而且手寫(xiě)代碼某些時(shí)候比界面拖拉操作更快捷。以下是筆者在使用SWT Designer開(kāi)發(fā)界面時(shí)的基本流程:l 新開(kāi)一個(gè)臨時(shí)的Application文件,用SWT Desiger快速做好開(kāi)發(fā)所需要的部份界面。l 將自動(dòng)生成的代碼移植到正式項(xiàng)目中,進(jìn)行手工修改和代碼精簡(jiǎn)。另外,由于SWT Designer不是很穩(wěn)定,所以在使用時(shí)還應(yīng)注意:l 不要在界面中加入太多組件。l 不要頻繁的移動(dòng)組件,或者刪除又添加組件,否則很可能因?yàn)閮?nèi)存耗盡而死機(jī)。6.6 本章小結(jié)本章主要介紹了SWT的一些基本知識(shí),并且用SWT Designer開(kāi)發(fā)出了本書(shū)的
43、第一個(gè)SWT程序。通過(guò)這章的學(xué)習(xí),讀者對(duì)SWT有一個(gè)初步的認(rèn)識(shí),并了解到了如何用SWT Designer來(lái)開(kāi)發(fā)SWT程序。第7章 SWT/JFace的事件模型7.1 事件的四種寫(xiě)法SWT的事件模型是和Java標(biāo)準(zhǔn)的AWT基本一樣的。在第6章的例子中,如何來(lái)實(shí)現(xiàn)文本框的事件響應(yīng)呢?比如:鼠標(biāo)雙擊文本框彈出一個(gè)對(duì)話框。下面將按照事件的四種寫(xiě)法來(lái)實(shí)現(xiàn)它。7.1.1 匿名內(nèi)部類(lèi)寫(xiě)法在原來(lái)的代碼行“text = new Text(shell, SWT.BORDER);”之下插入如下語(yǔ)句:/addMouseListener加入鼠標(biāo)事件的監(jiān)聽(tīng)器text.addMouseListener(new MouseA
44、dapter() public void mouseDoubleClick(MouseEvent e) /鼠標(biāo)雙擊事件的方法 /打開(kāi)一個(gè)信息框 MessageDialog.openInformation (null,Hello World); );new MouseAdapter()就是一個(gè)匿名內(nèi)部類(lèi)。我們建立了一個(gè)繼承于MouseAdapter的類(lèi),但并沒(méi)有給這個(gè)類(lèi)命名,并且沒(méi)有用通常的寫(xiě)法,而是直接在text.addMouseListener方法中寫(xiě)下了類(lèi)的代碼,這就是所謂的匿名內(nèi)部類(lèi)(更詳盡的解釋請(qǐng)參閱Java基礎(chǔ)類(lèi)書(shū)籍)。使用匿名內(nèi)部類(lèi)來(lái)寫(xiě)事件代碼簡(jiǎn)單方便,但也要注意它的一些缺點(diǎn):l
45、由于事件處理代碼會(huì)隨著組件一起分散在代碼中的各個(gè)部份,不夠集中,這樣會(huì)導(dǎo)致代碼閱讀與維護(hù)上的不便。l 各事件的處理全部由嵌套的程序塊組成,視覺(jué)上會(huì)顯示有些亂。如果事件處理代碼很長(zhǎng),也會(huì)導(dǎo)致了閱讀與維護(hù)上的不便。l 當(dāng)工具欄、菜單欄目等也需要處理相同的用戶行為時(shí),無(wú)法重用事件中的處理代碼,導(dǎo)致了代碼的臃腫。7.1.2 命名內(nèi)部類(lèi)寫(xiě)法事件代碼使用命名內(nèi)部類(lèi)的方式,可以解決匿名內(nèi)部類(lèi)存在的問(wèn)題:首先,事件處理代碼都集中在一起,并且都具有有意義的名稱(chēng),程序容易閱讀與維護(hù);另外,單個(gè)的事件處理程序也可以被工具欄、菜單欄等重用。實(shí)現(xiàn)代碼如下:public class HelloWorld public s
46、tatic void main(String args) Text text = new Text(shell, SWT.BORDER); /加入鼠標(biāo)事件監(jiān)聽(tīng)器,并用下面代碼所定義的內(nèi)部類(lèi)生成一個(gè)對(duì)象 text.addMouseListener(new MyMouseDoubleClick(); /定義一個(gè)名為MyMouseDoubleClick的內(nèi)部類(lèi) private static final class MyMouseDoubleClick extends MouseAdapter public void mouseDoubleClick(MouseEvent e) MessageDial
47、og.openInformation(null, , Hello World); 7.1.3 外部類(lèi)寫(xiě)法這種寫(xiě)法和命名內(nèi)部類(lèi)有些相似,只不過(guò)是將MyMouseDoubleClick類(lèi)從HelloWorld.java中拿出去,單獨(dú)寫(xiě)成一個(gè)類(lèi)文件。這種寫(xiě)法有和命名內(nèi)部類(lèi)一樣的優(yōu)點(diǎn),但因?yàn)橐獑为?dú)寫(xiě)成一個(gè)文件,寫(xiě)起來(lái)會(huì)麻煩一些。實(shí)現(xiàn)代碼如下/文件1: HelloWorld.javapublic class HelloWorld public static void main(String args) Text text = new Text(shell, SWT.BORDER); /加入鼠標(biāo)事件監(jiān)聽(tīng)器,并用下面代碼所定義的內(nèi)部類(lèi)生成一個(gè)對(duì)象 text.addMouseListener(new
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- fangwu追加合同范例
- 供應(yīng)五金合同范例
- 公園廣告合同范例
- 電子商務(wù)發(fā)展的法律與道德問(wèn)題
- 丹東場(chǎng)地租賃合同范例
- 學(xué)校反恐防暴安全教育
- 代理手工加工合同范例
- ktv聘用合同范例
- 燙燒傷病人疤痕的形成和預(yù)防
- 腹部斷層臨床聯(lián)系
- 2024年北京市重點(diǎn)建設(shè)項(xiàng)目政府投資計(jì)劃項(xiàng)目
- 金屬冶煉安全事故案例與分析
- 《柯高峰行政監(jiān)察學(xué)》課件
- 2024城市道路路面維修養(yǎng)護(hù)技術(shù)規(guī)程
- 老年糖尿病夜間低血糖的預(yù)防及護(hù)理
- 梅毒病人產(chǎn)后護(hù)理查房
- 小班-語(yǔ)言社會(huì)-幸福的“叮咚”-課件(基礎(chǔ)版)公開(kāi)課教案教學(xué)設(shè)計(jì)課件案例試卷
- 專(zhuān)業(yè)培訓(xùn)金蝶k3wise供應(yīng)鏈系統(tǒng)培訓(xùn)
- 辦公耗材采購(gòu) 投標(biāo)方案(技術(shù)方案)
- 《干部履歷表》填寫(xiě)樣式
- 汽車(chē)電氣設(shè)備檢測(cè)與維修中職全套教學(xué)課件
評(píng)論
0/150
提交評(píng)論