神兵利器eclipse開(kāi)發(fā)技術(shù)詳解_第1頁(yè)
神兵利器eclipse開(kāi)發(fā)技術(shù)詳解_第2頁(yè)
神兵利器eclipse開(kāi)發(fā)技術(shù)詳解_第3頁(yè)
神兵利器eclipse開(kāi)發(fā)技術(shù)詳解_第4頁(yè)
神兵利器eclipse開(kāi)發(fā)技術(shù)詳解_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第 4 章SWT 組件本章講解 SWT 的基本概念和特性,讀者需要了解基本界面元素的特性,通過(guò)容器的概念掌握界面元工作。間的互相關(guān)系與組件的體系結(jié)構(gòu),并掌握用其進(jìn)行程序開(kāi)發(fā)需要準(zhǔn)備的前期本章學(xué)習(xí)重點(diǎn):了解 SWT 的基本概念掌握在 Eclipse 環(huán)境下如何開(kāi)發(fā) SWT 程序熟悉常用的 SWT 組件熟悉常用的 SWT 容器綜合使用 SWT 進(jìn)行桌面程序 GUI 的開(kāi)發(fā)4.1SWT 簡(jiǎn)介SWT(Standard Widget Toolkit)本身僅僅是 Sun 公司為了開(kāi)發(fā) Eclipse IDE 環(huán)境所編寫(xiě)的一組底層圖形界面 API。它是跨GUI(圖形用戶(hù)界面)開(kāi)發(fā)工具包,無(wú)論是在性能上還是在

2、外觀上,都了之前的 AWT 和 Swing。AWT(Abstract Windowing Toolkit)是 Sun 公司開(kāi)發(fā)的一個(gè)跨GUI 開(kāi)發(fā)工具包。它一直未能突破 LCD 問(wèn)題,所以之后 Sun 為了補(bǔ)救,又創(chuàng)建了一個(gè)新的框架 Swing。這個(gè)框架雖然提供了豐富的窗口部件集,并且使用仿真窗口部件(emulated widgets)解決了 LCD 問(wèn)題,但也帶來(lái)了新的問(wèn)題。例如,Swing 應(yīng)用程序的界面外觀和原應(yīng)用程序的外觀不再相似,導(dǎo)致以前使用的 Java 桌面程序與系統(tǒng)上的其他程序看起來(lái)格格不入,并且會(huì)消耗太多的內(nèi)存,不適于一些小設(shè)備,如PDA 和移動(dòng)等。IBM 努力嘗試以徹底解決

3、AWT 和 Swing 框架帶來(lái)的上述問(wèn)題,最終,創(chuàng)建了一個(gè)新的 GUI說(shuō) 明LCD(Liquid Crystal Display),中文意思是液晶顯示器。第 4 章SWT 組件庫(kù),這就是 SWT。這個(gè)框架通過(guò) JNI(Java Nativeerface,它允許 Java 代碼和其他語(yǔ)言寫(xiě)的代碼進(jìn)行交互)來(lái)宿主操作系統(tǒng)中的資源。如果在宿主上無(wú)法找到一個(gè)窗口部件,框架就會(huì)自動(dòng)地模擬它。4.1.1概述Eclipse 將 SWT 描述為一種“與本地窗口系統(tǒng)結(jié)合但與操作系統(tǒng)無(wú)關(guān)的 API 窗口小部件集及圖形庫(kù)”。目前隨著 Eclipse 的逐漸開(kāi)發(fā),SWT 已經(jīng)十分穩(wěn)定。這里的穩(wěn)定首先是指性能上的穩(wěn)定

4、,只要操作系統(tǒng)提供了相應(yīng)圖形的構(gòu)件,那么 SWT 便會(huì)簡(jiǎn)單應(yīng)用 JNI 技術(shù)調(diào)用它們,只有那些操作系統(tǒng)中不提供的構(gòu)件,才會(huì)進(jìn)行模擬的實(shí)現(xiàn)??梢钥闯?SWT 性能上的穩(wěn)定性大多取決于相應(yīng)操作系統(tǒng)圖形構(gòu)件的穩(wěn)定性。其次穩(wěn)定是指 API 包中的類(lèi)、方法的名稱(chēng)和結(jié)構(gòu)已經(jīng)少有改變,程序員不用擔(dān)心由于 Eclipse 組織開(kāi)發(fā)進(jìn)度很快,而導(dǎo)致自己的程序代碼變化過(guò)大。從一個(gè)版本更新至另一版本,通常只需簡(jiǎn)單將包換掉就即可。SWT 在功能上與 AWT/SWING 十分類(lèi)似,但是組件更為豐富,而且解決了許多穩(wěn)定性的問(wèn)題。如果應(yīng)用程序需要跨運(yùn)行,而且需要保證性能與美觀,且不要依賴(lài) AWT/SWING 的話(huà),SWT

5、是一個(gè)非常好的選擇。4.1.2基本特性類(lèi)“Widget”(窗口小部件)包括了 SWT 中的所有控件,其基類(lèi)包括:“Control”(控制)、“”(菜單)、“ScrollBar”(滾動(dòng)條)、“Item”(項(xiàng))等,如圖 4-1 所示為“Widget”的類(lèi)圖。ltemButtonLabelProgressBarScrollableltemTreeltemBrowserCoolBarGroupTableTree圖 4-1Widget 類(lèi)圖“Widget”的子類(lèi)“Control”是一個(gè)比較龐大的基類(lèi),大部分部件都在此類(lèi)下,其直接子類(lèi)有“Button”(按鈕)、“Label”(標(biāo)記)、“ProgressB

6、ar”(進(jìn)度條)等。“Control”的子類(lèi)“Scrollable”是所有可以帶滾動(dòng)條的對(duì)象的基類(lèi),比如“Text”(文本框)、“List”(列表框)等。“Scrollable”的子類(lèi)“Comite”是 SWT 中一個(gè)重要的類(lèi),是所有可容納其他部件的類(lèi)的基類(lèi),其子類(lèi)有“Browser”(瀏覽器)、“Group”(組合框)、“Table”(表格)、“Tree”(樹(shù))等。91ComiteTextListTableIterScrollBarControlWidget第 2 篇SWT 應(yīng)用“Widget”的基類(lèi)“Item”下是一些無(wú)法獨(dú)立于其他部件的部件,比如“項(xiàng))、“TableItem”(表格項(xiàng))、

7、“TreeItem”(樹(shù)項(xiàng))等。Item”(菜單以上是 SWT 所含有的基本實(shí)體控件,但是在要想創(chuàng)建一個(gè)窗口,至少要用到兩個(gè)類(lèi):“Display”和“S”?!癉isplay”類(lèi)起管理者的作用,負(fù)責(zé)處理所有“Widget”和操作系統(tǒng)之間的交互,比如可以通過(guò)其內(nèi)部的方法來(lái)查詢(xún)操作系統(tǒng):哪個(gè)控件獲取了焦點(diǎn),當(dāng)前打開(kāi)了哪些窗口,等等?!癝口可以創(chuàng)建其他的”實(shí)例提供了真正可見(jiàn)的窗口。該窗口一般作為主窗口使用,如果主窗框,這時(shí)會(huì)產(chǎn)生不同的實(shí)例,這個(gè)新建的框應(yīng)當(dāng)作為主窗口實(shí)例的子對(duì)象。從這點(diǎn)可以知道,“S”實(shí)例可以直接從“Display”創(chuàng)建,也可以從父代創(chuàng)建。4.2SWT 程序在 Eclipse 編程環(huán)境

8、中編寫(xiě) SWT 程序首先需要引入相關(guān)的依賴(lài)包。方式已經(jīng)面介紹過(guò)了,軟件內(nèi)部自帶了 SWT 的 JAR 文件,同時(shí)也可以到獲得相關(guān)內(nèi)容。4.2.1加入 SWT 依賴(lài)包通過(guò) Eclipse 新建一個(gè) Java 工程之后,就可以通過(guò)配置工程的屬性來(lái)添加新的依賴(lài)目錄。一般配置的原理就是為當(dāng)前工程配置一個(gè)新的 Classpath,這樣在以找到相應(yīng)的名字空間了。(1)右擊項(xiàng)目頭部,選擇“Properties”菜單,如圖 4-2 所示。SWT 內(nèi)容的時(shí)候,就可(2)單擊 Properties 命令,彈出“Java Build Path”框,如圖 4-3 所示,單擊其中的“AddJARs ” 按鈕就可以進(jìn)入瀏

9、覽器菜單。 通過(guò)瀏覽器去尋找 SWT 的 JAR包,名字是“.eclipse.swt.win32.win32.x86_3.2.0.v3232m.jar”。圖 4-2配置 SWT 工程圖 4-3Java Build Path(3)Eclipse 的界面程序是基于 JFace 寫(xiě)成的,而 JFace 就是 SWT 的一個(gè)擴(kuò)展。所以,要想92第 4 章SWT 組件找到 SWT 的 JAR 文件,就需要在 Eclipse 安裝目錄下的 plugins 文件夾下尋找。找到之后雙擊文件,就完成了加入 SWT 的依賴(lài)包的任務(wù),效果如圖 4-4 所示。除了在 Eclipse 中尋找默認(rèn)的安裝包以外,還有另一種

10、獲圖 4-4成功加入依賴(lài)得 SWT 工具包的方法,就是Eclipse 中的 SWT 的“首頁(yè)如圖 4-5 所示。”,在這里可以找到最新發(fā)布信息,版本介紹以及源代碼等。圖 4-5SWT在上可以選擇SWT 的開(kāi)發(fā)包以及源文件。Eclipse會(huì)根據(jù)機(jī)器的 IP選擇最近的鏡像來(lái)提供,如圖 4-6 所示。圖 4-6SWT前面的簡(jiǎn)介中提到過(guò),SWT 雖然是用 Java 實(shí)現(xiàn)的,但是并沒(méi)有脫離無(wú)關(guān)性,圖 4-7所示為 SWT 在不同操作系統(tǒng)中運(yùn)行的效果。正是其依賴(lài)性才使得 SWT 的顯示效果要高于AWT 和 SWING。從圖中可以看到,對(duì)于不同的系統(tǒng),所展現(xiàn)出的界面效果的差異相當(dāng)大。4.2.2 “o wor

11、ld”程序首先從最典型的“oWorld”程序開(kāi)始逐漸講解 SWT 的程序結(jié)構(gòu),了解什么是“Display”和“S”對(duì)象。在工程“swt”中建立一個(gè)“oWorld”類(lèi)。這里在類(lèi)配置模板中勾選“生成 main 函數(shù)”復(fù)選框。在圖 4-8 中單擊“Finish”按鈕之后就可以進(jìn)行程序的編寫(xiě)了。93第 2 篇SWT 應(yīng)用圖 4-7各種 SWT 頁(yè)面圖 4-8生成oWorld 類(lèi)在oWorld 類(lèi)中簡(jiǎn)單地添加部分代碼,實(shí)現(xiàn)在一個(gè)框中顯示o World 并且輸出一個(gè)圖標(biāo)。運(yùn)行結(jié)果如圖 4-9 所示。以下是類(lèi)中的代碼:圖 4-9o World94import.eclipse.swt.*;import.ecl

12、ipse.swt.custom.CLabel; import.eclipse.swt.widgets.*;public classoWorld public sic void main(String args) /程序主方法Display dipl = new Display ();/創(chuàng)建 Display 對(duì)象 diplSshl= new S(dipl);/創(chuàng)建前面 Display 對(duì)象的 S對(duì)象 shl shl.setText(SWT);shl.setImage(dipl.getSystemImage(SWT.ICON QUESTION); CLabel lbl = new CLabel (

13、shl,SWT.LEFT);/創(chuàng)建 Label 對(duì)象 lbl.setImage(dipl.getSystemImage(SWT.ICON INFORMATION); lbl.setText(o Worldn);/創(chuàng)建 Label 顯示的文字 lbl.pack();shl.pack();shl.open();while(!shl.isDised()/銷(xiāo)毀資源第 4 章SWT 組件下面逐行解釋代碼并介紹相關(guān)內(nèi)容。首先一個(gè)“Display”類(lèi),用于直接調(diào)用當(dāng)前系統(tǒng)資源的對(duì)象,它封裝了部分相關(guān)的方法。但是只有“Display”對(duì)象是不能顯示出窗口的,還需要?jiǎng)?chuàng)建窗口對(duì)象“S”。它的概念和 Visual

14、C+中的“Window”以及和 VC#中的“Form”的概念類(lèi)似。根據(jù)層次關(guān)系,“S”對(duì)象要在“Display”對(duì)象下面創(chuàng)建,一個(gè)“Display”可以被多個(gè)“S”調(diào)用??紤]到實(shí)際用”,并且指向同一個(gè)到的軟件出現(xiàn)的多窗口應(yīng)用的情況,每個(gè)窗口都應(yīng)當(dāng)“Display”。為一個(gè)“SDi s p l a y d i p l = n ew Di s p l a y () ; ./ /創(chuàng)建D i s p l a y 對(duì)象 d i p l/ /創(chuàng)建前面D i s p l a y 對(duì)象的 SSs h l = n ew S( d i p l ) ;對(duì)象 s h l程序?qū)τ凇癝”的某些屬性進(jìn)行了定義與修改。這里簡(jiǎn)

15、單給窗口定義了一個(gè)標(biāo)題“SWT”,之后又定義了一個(gè)圖標(biāo)。前面“S”對(duì)象添加到“Display”中,之后應(yīng)當(dāng)做的是為其添加各種小窗口部件(Widget)。這種層級(jí)的對(duì)應(yīng)關(guān)系也是一對(duì)多的。為了顯示“o World”,程序中使用了 Label 控件,并且是 Label 的升級(jí)控件,CLabel。一般的 Label 對(duì)象只可以顯示文字或者文本,而 CLabel 可以二者同時(shí)顯示。初始化控件的時(shí)候,必須要依托一個(gè)“S”對(duì)象。在初始化的構(gòu)造函數(shù)的第二個(gè)參數(shù)“SWT.LEFT”表示這個(gè)控件中的內(nèi)容是采用左對(duì)齊的對(duì)齊方式。接下來(lái)繼續(xù)在控件中設(shè)置屬性。后面要做的工作就是顯示這個(gè)窗口了,在顯示之前需調(diào)整每個(gè)對(duì)象中

16、包含的元素的布局,可以使用 pack()方法。該方法的作用是,發(fā)送調(diào)整信息,調(diào)整所有的接收者的大小,回到各自的首選尺寸。所謂的接收者就是調(diào)用該方法的對(duì)象。該方法可以添加型參數(shù),如果參數(shù)為“true”,表示小窗口部件(Widget)會(huì)采用其正常的大小,而且會(huì)盡可能靠左對(duì)齊,如果參數(shù)為“false”,小窗口部件會(huì)填充可用的空間。一般會(huì)在 SWT 的布局函數(shù)中使用 pack()方法。95l b l . p ac k () ;s h l . p ac k () ;/ /調(diào)整布局s h l . op e n () ;/ /打開(kāi)窗口l b l . s e t Ima g e ( d i p l . g e

17、 t Sy s t emIma g e ( SWT . ICON INFORMAT ION ) ;/ /設(shè)置 l a b e l 顯示的,使用系統(tǒng)默認(rèn)的l b l . s e t Te x t ( o Wo r l d n ) ;/ /設(shè)置l a b e l 顯示的文字CLa b e l l b l = n ew CLa b e l ( s h l , SWT .LEFT ) ;/ /在 s h l 對(duì)象中初始化一個(gè)新的 l a b e l 控件s h l . s e t Te x t ( SWT );/ /為框設(shè)置標(biāo)題s h l . s e t Ima g e ( d i p l . g e

18、 t Sy s t emIma g e ( SWT . ICON QUEST ION ) ;/ /為框設(shè)置圖標(biāo),這里采用的是系統(tǒng)默認(rèn)圖標(biāo),是從 SWT 調(diào)用的系統(tǒng)默認(rèn)資源中的,也可使用自定義圖標(biāo)i f ( d i p l . r ea dAndDi s p a t c h () d i p l . s l ee p () ;d i p l . d i se () ;第 2 篇SWT 應(yīng)用運(yùn)行到這里,整個(gè)程序就算基本完成了,后面關(guān)閉窗口進(jìn)行資源銷(xiāo)毀工作。代碼如下:Java 也使用類(lèi)似 Windows 程序設(shè)計(jì)中消息循環(huán)的方法來(lái)處理事件。這段代碼的意義就是反復(fù)和分派(dispatch)事件,并在沒(méi)

19、有事件的時(shí)候把控制權(quán)還給 CPU。這里可以看到很清晰的 SWT 程序的編寫(xiě)步驟:創(chuàng)建“Display”對(duì)象。描述“Display”對(duì)象。為“Display”添加“S描述“S”對(duì)象。”對(duì)象。(5)為“S”對(duì)象添加各種“Widget”(窗口部件)。描述各個(gè)部件的屬性,協(xié)同關(guān)系以及和上層“S調(diào)整布局。顯示窗口?!钡年P(guān)系。4.2.3運(yùn)行 SWT 應(yīng)用當(dāng)程序中了 SWT 包之后,選擇“Run As”“SWT Application”命令,如圖 4-10 所示。運(yùn)行 SWT 的界面程序必須要選擇這個(gè)選項(xiàng),否則會(huì)有出錯(cuò)信息提示。圖 4-10運(yùn)行 SWT 應(yīng)用一般情況下,如果還是選擇運(yùn)行 Java 程序選項(xiàng)的

20、話(huà),會(huì)有如下的錯(cuò)誤提示:導(dǎo)致該錯(cuò)誤的原因是沒(méi)有為 Java 程序添加本地庫(kù)文件。如果將“.eclipse.swt.win32.win32.x86_3.2.0.v3232m.jar”文件解壓縮的話(huà),會(huì)發(fā)現(xiàn)在“os/win32/x86”目錄下有幾個(gè)“dll”文件,這些是 SWT本地操作系統(tǒng)所需要的接口。運(yùn)行 Java 程序的時(shí)候必須能夠到這些文件,程序才可以正常運(yùn)行。具體有以下幾種解決方式:(1)最簡(jiǎn)單的辦法就是直接把“.dll”文件到 JRE 的“bin”目錄下。96Exceptionhread main java.lang.UnsatisfiedLinkError: no swt-win32-

21、3232 in java.library.pathat java.lang.ClassLoader.loadLibrary(Unknown Source) at java.lang.Runtime.loadLibrary0(Unknown Source)at java.lang.System.loadLibrary(Unknown Source)at.eclipse.swt.ernal.Library.loadLibrary(Library.java:123) at.eclipse.swt.ernal.win32.OS.(OS.java:18)at.eclipse.swt.widgets.Di

22、splay.(Display.java:125)atoWorld.main(oWorld.java:8)while(!shl.isDised()if (dipl.readAndDispatch() dipl.sleep();dipl.dise();第 4 章SWT 組件(2)設(shè)定環(huán)境變量,在參數(shù)“PATH”中加入“dll”文件。(3)把“.eclipse.swt.win32.win32.x86_3.2.0.v3232m.jar”里面的“swt-win32- 3232.dll”解壓縮出來(lái)到“WINDOWSSYSTEM32”目錄中。以上 3 種方法都可以保證 SWT 程序能正常運(yùn)行。4.3可視化

23、SWT 編程組件Java 從最初開(kāi)始,即使是做 UI 程序也都是由程序員手寫(xiě)的。一度“Edit Plus”+“Javac”的文本和命令行方式是 Java 程序員最常用的開(kāi)發(fā)方式。軟件開(kāi)發(fā)追求敏捷。如果有快速開(kāi)發(fā)的方式,程序員不應(yīng)當(dāng)年的使用,人們已經(jīng)使用。Windows 下的可視化開(kāi)發(fā)輔助環(huán)境做的比較成熟,而且由于多。相關(guān)的可視化用戶(hù)界面開(kāi)發(fā)起步比較晚,而且成產(chǎn)品除了NetBeans 似乎沒(méi)有什么太流行的。本身 Java 界面相對(duì)做的就不是很成熟,再加上沒(méi)有更好的可視化編程環(huán)境,使得 Java 桌面程序處于落后地位。但是有了 SWT 與眾不同的實(shí)現(xiàn)方式,Java 程序編寫(xiě)的界面實(shí)現(xiàn)了高效與美觀并

24、行。再加上有一款比較成可視化編程輔助工具,編寫(xiě)界面程序已經(jīng)不再是難事了。本小節(jié)介紹兩款可以在 Eclipse 中使用的可視化編程插件,SWT Designer 和 Visual Editor。這兩款產(chǎn)品的使用都比較方便,而且和 Eclipse 結(jié)合比較穩(wěn)定,在實(shí)際編程過(guò)程中,使用這兩款產(chǎn)品的程序員越來(lái)越多。下面簡(jiǎn)單講解這兩款產(chǎn)品的特性及安裝使用方式。4.3.1SWT DesignerSWT Designer 是一款十分簡(jiǎn)潔的可視化編程插件。該軟件是一款的插件,在使用的時(shí)候必須是“或者。首先進(jìn)入 SWT Designer 的主頁(yè),如圖 4-11 所示,進(jìn)行/”。,主頁(yè)地址圖 4-11SWT De

25、signer 首頁(yè)97第 2 篇SWT 應(yīng)用在首頁(yè)中找到頁(yè)面,地址為“./swt-designer/download.html”,從中選擇適合本機(jī)操作系統(tǒng)的安裝包。如果為常用的 Windows 操作系統(tǒng)的話(huà),應(yīng)當(dāng)?shù)谝恍械能浖?,單擊如圖 4-12 所示的“Full Installer for Windows”。圖 4-12頁(yè)面SWT Designer 除了本身的文件很大以外和一般的 Eclipse 插件沒(méi)有任何區(qū)別。安裝過(guò)程就是按照前面介紹的各種步驟進(jìn)行。將的文件“D11esigner_v6.5.0_for_Eclipse3.2.zip”解壓縮之后放置到 Eclipse 中的“plugins”

26、文件夾下面。此外該軟件還提供了一個(gè)用于卸載的批處理文件“delete.bat”來(lái)進(jìn)行軟件的刪除。正確安裝 SWT Designer 之后需要重新啟動(dòng) Eclipse。之后,新建一個(gè)工程便可以看到如圖 4-13 所示的項(xiàng)目選擇窗口多出了一個(gè)“Designer”項(xiàng)目,里面可以直接創(chuàng)建“SWT/JFace JavaProject”或者“Widget Paletle Plug-in”。除了從向?qū)е薪⒔缑娉绦蛑?,只要是使用了界面相關(guān)內(nèi)容的源程序文件,SWT Designer都可以進(jìn)行識(shí)別,然后在程序窗口的左下角會(huì)出現(xiàn)源程序和設(shè)計(jì)頁(yè)面的一個(gè)切換。與一般可視化編程環(huán)境不同的是,SWT Designer

27、的設(shè)計(jì)和程序是分離的。圖 4-14 所示為使用 Swing 組件的例子。前面提到了 SWT Designer 是一個(gè)的軟件,如圖 4-15 所示,在其主頁(yè)上有明確的限制。信息。如果沒(méi)有辦法的話(huà)也可以選擇試用方式或者評(píng)估方式,只是功能上會(huì)受單擊圖 4-14 所示的“Design”之后就會(huì)觸發(fā) SWT Designer 程序,首先出現(xiàn)信息,效果如圖 4-16 所示,SWT Designer 希望用戶(hù)或者評(píng)估。從頁(yè)面中可以選擇或者免費(fèi)試用。試用的話(huà)只能選擇 “SWT 可視化設(shè)計(jì)器”、“Swing 設(shè)計(jì)器”和“窗口”中的一種,并且還是部分功能進(jìn)行試用。如果了 SWTDesigner 產(chǎn)品,用戶(hù)將會(huì)獲得

28、一個(gè)序列號(hào),只要在框中輸入序列號(hào)和激活碼就可以使用該98第 4 章SWT 組件產(chǎn)品的全部功能了。下面演示如何試用版。圖 4-13SWT Designer 項(xiàng)目圖 4-14源文件視圖圖 4-15的 SWT Designer(1)在激活框中選擇試用方式之后會(huì)顯示“Next”按鈕,單擊“Next”按鈕進(jìn)入如圖 4-17 所示的個(gè)人信息填寫(xiě)界面,輸入個(gè)人信息。(2)單擊“Next”按鈕,頁(yè)面將會(huì)自動(dòng)連接到 SWT Designer 的安裝頁(yè)面“進(jìn)行,之后就可以試用了,如圖 4-18 所示。com”99第 2 篇SWT 應(yīng)用圖 4-16激活頁(yè)面圖 4-17個(gè)人信息完成之后,前面提到的 Java 源文件就

29、可以用可視化的方式編輯了,效果如圖 4-19 所示。SWT Designer 的功能已經(jīng)比較全面了,但仍只能作為編程的一個(gè)輔助工具,畢竟它還有許多地方做得還不如微軟的產(chǎn)品使用起來(lái)方便。在 SWT Designer 中手工寫(xiě)代碼還是很重要的,而且當(dāng)界面組件增多的時(shí)候,SWT Designer 十分耗費(fèi)資源,甚至可能會(huì)導(dǎo)致 Eclipse 內(nèi)存異常而退出。100第 4 章SWT 組件圖 4-18連接圖 4-19Design 頁(yè)面4.3.2Visual EditorVisual Editor 也是一款可視化的 GUI 開(kāi)發(fā)工具,也是以插件的方式安裝到 Eclipse中去的,可以開(kāi)發(fā) Swing/JF

30、C 和 SWT/RCP 桌面程序。Visual Editor 是附屬于 Eclipse 的開(kāi)源項(xiàng)目,和 SWT Designer 不同的一點(diǎn)是,Visual Editor 是免費(fèi)的。Visual Editor 需要兩個(gè) Eclipse 組件來(lái)支持,安裝 Visual Editor 之前要EMF”和“GEF”組件。這些組件都可以在 Eclipse 的上找到。下面三個(gè)文件并且以插件方式安裝到 Eclipse 中,就可以使用 Visual Editor 了。101第 2 篇SWT 應(yīng)用GEF-runtime-3.0.1.zipemf-sdo-runtime-2.0.1.zipVE-runtime-1

31、.1.0.1.zip確定 Visual Editor 正確安裝的方法是在 Java 工程的頭部右擊,單擊“添加”(new)菜單,如果出現(xiàn)“Visual Class”和“Example”兩個(gè)選項(xiàng)就表示已經(jīng)正確安裝了 Visual Editor?!癊xample”選項(xiàng)中是 Visual Editor 自帶的兩個(gè)工程,目的是作為指導(dǎo)開(kāi)發(fā)的例子來(lái)使用,分別是一個(gè)瀏覽器和一個(gè)文本編輯器。Visual Editor 的開(kāi)發(fā)環(huán)境和 SWT Designer 有一些不同,體現(xiàn)在按鈕的排布和分類(lèi)上。但這些都不會(huì)影響使用。使用 Visual Editor 也需要新建 Java 工程,這點(diǎn)也和 SWT Design

32、er 不同。新建 Java 工程之后在添加新類(lèi)的時(shí)候選擇 Visual Class 就可以使用可視化界面了,如圖 4-20所示。下面的工作是添加一個(gè)可視化類(lèi)的配置窗口。一般創(chuàng)建窗口文件都需要選擇 SWT 中的S類(lèi)型,然后輸入類(lèi)的名字并且選擇“public sic void main (String arg)”來(lái)構(gòu)造一個(gè)“main”方法。單擊圖 4-21 中的“Finish”按鈕就可以進(jìn)行可視化編輯了。圖 4-20Visual Editor 編輯界面圖 4-21配置 Visual Class4.4基類(lèi) ControlSWT 的控件類(lèi)結(jié)構(gòu)不像一般的 GUI 類(lèi)庫(kù),沒(méi)有單一的父組件。常見(jiàn)的 Swin

33、g 和微軟的 MFC都有一個(gè)Item。的父類(lèi)。SWT 中有幾個(gè)比較重要的父類(lèi),分別是、ite 和(1)Widget 是基本的 SWT GUI 組件類(lèi)似于 Java AWT 中的 Component 和 Swing 中的JComponent。Widget 是一個(gè)抽象類(lèi),是圖形用戶(hù)接口的元素。102第 4 章SWT 組件(2)Control 擁有操作系統(tǒng)的對(duì)等物的窗口小部件(換句話(huà)說(shuō),在操作系統(tǒng)中具有同一是一個(gè)抽象類(lèi)。),(3)Comite 包含其他控件的控件(類(lèi)似于 Java AWT 中的 Container 和 Swing 中的 JPanel)屬于容器類(lèi)。Comite 可以包含其他 Comit

34、e 和 Control 的容器。(4)Item 是其他控件包含的窗口小部件(該控件可能不是復(fù)合控件),比如列表和表。注意;包含一些項(xiàng)的控件很少包含其他控件,反之亦然。Item 也是一個(gè)抽象類(lèi)。Item 類(lèi)是一個(gè)輕量級(jí)的系統(tǒng)對(duì)象,總是作為基本的元素與其他一些類(lèi)配合使用。比如 Tree 中的元素即為 TreeItem,Table 的元素則是 TableItem,的元素則是Item 了。4.4.1繼承關(guān)系SWT 的 Java 文檔內(nèi)嵌在 Eclipse SDK 幫助文檔中。只要在開(kāi)發(fā)環(huán)境中選擇“Help”“Help Content”命令就可以在 API 中找到相關(guān)信息,如圖 4-22 所示。“Con

35、trol”類(lèi)可以表示一般的用戶(hù)界面元素,是操作系統(tǒng)的標(biāo)準(zhǔn)控件。這些操作系統(tǒng)控件都被定義為這個(gè)類(lèi)的子類(lèi)。例如 Button、Text 都是其子類(lèi)?!癈ontrol”繼承自 Drawable,其直接被繼承的子類(lèi)有:Button、Label、Link、ProgressBar、Sash、Scrollable、Slider。4.4.2Control 類(lèi)的常用方法“Control”類(lèi)本身是抽象類(lèi),在 Eclipse API 中的相關(guān)文檔如圖 4-23 所示,在其中用戶(hù)可以事件、修改外觀、屬性和視圖等。圖 4-22SWT API圖 4-23Control 類(lèi)“Control”類(lèi)常用方法:addControl

36、Listener(ControlListener listener):給當(dāng)前控件ControlListener器,當(dāng)Control 對(duì)象被移動(dòng)或者尺寸改變的時(shí)候把ControlListener 接口中定義的消息發(fā)給的器。103第 2 篇SWT 應(yīng)用addFocusListener(FocusListener listener):給當(dāng)前控件FocusListener器,當(dāng)?shù)谋O(jiān)Control 對(duì)象失去或者獲得焦點(diǎn)的時(shí)候把 FocusListener 接口中定義的消息發(fā)給。addHelpListener(HelpListener listener):給當(dāng)前控件HelpListener器,當(dāng) Cont

37、rol器。對(duì)象觸發(fā)幫助事件的時(shí)候把 HelpListener 接口中定義的消息發(fā)給的addKeyListener(KeyListener listener):給當(dāng)前控件KeyListener器,當(dāng)有鍵盤(pán)操作,比如按下或者松開(kāi)的時(shí)候,把 KeyListener 接口中定義的消息發(fā)給的器。器,當(dāng)addMouseListener(MouseListener listener):給當(dāng)前控件MouseListener鼠標(biāo)的按鈕有動(dòng)作,比如按下或者松開(kāi)的時(shí)候把 MouseListener 接口中定義的消息發(fā)給的器。addMouseMoveListener(MouseMoveListener listene

38、r): 給當(dāng)前控件MouseMoveListener。器,當(dāng)鼠標(biāo)移動(dòng)時(shí)把 MouseMoveListener 接口中定義的消息發(fā)給的監(jiān)addMouseTrackListener(MouseTrackListener listener): 給當(dāng)前控件MouseTrackListener器,當(dāng)鼠標(biāo)經(jīng)過(guò)或者在某個(gè)控件上面移動(dòng)的時(shí)候把 MouseTrackListener 接口中定義的消息發(fā)給的器。addPaListenaListener listener):給當(dāng)前控件PaListener器,當(dāng)事件器。接收者進(jìn)行繪制的時(shí)候把 PaListener 接口中定義的消息發(fā)給的addTraverseListe

39、ner(TraverseListener listener):給當(dāng)前控件當(dāng)有經(jīng)過(guò)事件的時(shí)候把 TraverseListener 接口中定義的消息發(fā)給TraverseListener器,的器。computeSize(computeSize(wH,wH,hH):返回接收者的首選尺寸。hH,changed):返回接收者的首選尺寸(重載)。forceFocus():強(qiáng)制接收者獲得鍵盤(pán)輸入焦點(diǎn),使得全部的鍵盤(pán)時(shí)間發(fā)送到當(dāng)前的接收者那去。getAcsible():返回當(dāng)前接收者可以使用的對(duì)象。getBackground():返回當(dāng)前接收者的背景顏色。 getBackgroundImage():返回當(dāng)前接收

40、者的背景getBorderWidth():返回當(dāng)前接收者的邊際寬度。getBounds():返回一個(gè)矩形來(lái)描述接收者的尺寸和對(duì)于父類(lèi)的相對(duì)位置。getEnabled():返回型表示當(dāng)前接收者是否可以操作getFont():返回接收者用于處理文字信息的字體。 getForeground():返回接收者用于畫(huà)圖的前景顏色。 getLayoutData():返回接收者相關(guān)的布局信息。getLocation():返回接收者對(duì)于父類(lèi)的相對(duì)位置。get():如果存在右鍵彈出菜單的話(huà)則返回菜單,否則返回 null。getMonitor():返回接收者的器。getParent():返回接收者的父類(lèi)。getS(

41、):返回接收者的 S類(lèi)。104第 4 章SWT 組件getSize():返回接收者的尺寸。getToolTipText():返回接收者的 getVisible():返回接收者是否可見(jiàn)。說(shuō)明文字。ernal_dise_GC(hDC,ata data):?jiǎn)酒鸹厥站浔??;厥站浔?。ernal_new_GC(ata data):?jiǎn)酒甬a(chǎn)生新的isEnabled():返回接收者是否可操作。 isFocusControl():返回接收者是否具有控制焦點(diǎn)。 isReparentable():返回接收者是否支持修改父類(lèi)。 isVisible():返回接收者是否可見(jiàn)。moveAbove(Control contro

42、l):將接收者的繪圖順序上移到某個(gè)控件之上。moveBelow(Control control):將接收者的繪圖順序上移到某個(gè)控件之下。 pack():使接收者的尺寸變成預(yù)先設(shè)定的尺寸。pack(changed):使接收者的尺寸變成預(yù)先設(shè)定的尺寸。redraw():使接收者的全部邊界變成準(zhǔn)備重繪狀態(tài)。redraw(狀態(tài)。x,y,width,height,all):使接收者的指定位置變成準(zhǔn)備重繪removeControlListener(ControlListener listener):移除 ControlListener。 removeFocusListener(FocusListener

43、listener):移除 FocusListener。 removeHelpListener(HelpListener listener):移除 HelpListener。 removeKeyListener(KeyListener listener):移除 KeyListener。 removeMouseListener(MouseListener listener):移除 MouseListener。 removeMouseMoveListener(MouseMoveListener listener):移除 MouseMoveListener。removeMouseTrackListen

44、er(MouseTrackListener listener):移除 MouseTrackListener。removePaListenaListener listener):移除 PaListener。removeTraverseListener(TraverseListener listener):移除 TraverseListener。setBackground(Color color):設(shè)定接收者的背景顏色。setBackgroundImage(Image image):設(shè)定接收者的背景。setBounds(x,y,width,height):設(shè)定接收者的尺寸和位置。setBounds

45、(Rectangle rect):由指定的位置設(shè)定接收者的尺寸和位置。setCapture(capture):如果設(shè)置為 true,則所有的鼠標(biāo)時(shí)間都將發(fā)送到接收者那里。setCursor(Cursor cursor):設(shè)定光標(biāo)。setEnabled(enabled):設(shè)定可操作。setFocus():設(shè)定獲得焦點(diǎn)。 setFont(Font font):設(shè)定字體。setForeground(Color color):設(shè)定前景色。setLayoutData(Object layoutData):設(shè)定布局。setLocation(setLocation(Pox,y):設(shè)定位置。location)

46、:設(shè)定位置(重載)。105第 2 篇SWT 應(yīng)用set():設(shè)定菜單。ite parent):設(shè)定父類(lèi)。 redraw):設(shè)定重繪。height):設(shè)定尺寸。setParent(ComsetRedraw(setSize(setSize(Powidth,size):設(shè)定尺寸(重載)。setToolTipText(String string):設(shè)定說(shuō)明文字。setVisiboolean visible):設(shè)定可見(jiàn)。4.5常 用 組 件SWT 集成了桌面程序中的各種組件,通過(guò)這些組件就可以寫(xiě)出外觀優(yōu)美功能強(qiáng)大的界面程序。本節(jié)逐個(gè)介紹各種常用組件,這些組件都繼承自“Control”類(lèi),所以前面提到的常

47、用方法都可以在這些類(lèi)中使用到。有些程序?yàn)榱酥v解方便給出了行號(hào),但只是當(dāng)前程序段中的行號(hào),并不是在整個(gè)程序中的位置。4.5.1按鈕按鈕(button)是界面中最常用的控制元素。SWT 中的按鈕有 SWT.PUSH(單擊按鈕)、 SWT.TOGGLE(鎖定按鈕)、SWT.ARROW(箭頭按鈕)、SWT.RADIO(單選按鈕)和 SWT.CHECK(復(fù)選按鈕)等。1SWT.PUSH(單擊按鈕)圖 4-24 所示是一個(gè)簡(jiǎn)單的單擊按鈕,它是最普通的按鈕。在程序中還可以添加對(duì)按鈕的說(shuō)明提示。初始化該按鈕的代碼如下,之后的代碼都會(huì)省略對(duì)名字空間的和類(lèi)的定義等,也不再展示 S設(shè)置,只展示空間本身的代碼。圖 4

48、-24 所示的“this is a button”是功能提示,當(dāng)鼠標(biāo)移動(dòng)到按鈕上方的時(shí)候會(huì)自動(dòng)出現(xiàn)。程序的第 1 行是初始化,將當(dāng)前的按鈕到 S中去,把 S作為按鈕的父類(lèi)。這里為其指定的按鈕類(lèi)型是“SWT.PUSH”。在第 2 行中設(shè)定其文字顯示,為“o World”。然后在第 3 行中設(shè)定文字提示。最后使用 pack()方法由系統(tǒng)去重新設(shè)定按鈕的大小。按鈕的外觀除了這個(gè)之外還有平面按鈕和有邊界按鈕兩種,這是很早的 Windows3.1 的風(fēng),如圖 4-25 所示。格按鈕,現(xiàn)在看起來(lái)似乎有一些不圖 4-24單擊按鈕圖 4-25按鈕樣式106Button button = new Button

49、(s,SWT.PUSH);button.setText(o World);button.setToolTipText(this is a button);button.pack();第 4 章SWT 組件這 3 種按鈕除了在初始化按鈕時(shí)用了不同的參數(shù),其他方面的設(shè)計(jì)是一樣的。在程序的第 7 行多出了一行控制顯示位置的代碼是靠獲得前一個(gè)控件的相對(duì)位置來(lái)排布的。如果不加這行代碼,產(chǎn)生的結(jié)果是所有按鈕在同一個(gè)位置2SWT.TOGGLE(鎖定按鈕),無(wú)法正常顯示。鎖定按鈕是一種狀態(tài)按鈕,有按下和彈起兩種狀態(tài)。鎖定按鈕同樣有 3 種樣式,初始化代碼如下:鎖定按鈕的彈起按鈕和一般的按鈕沒(méi)有區(qū)別,圖4-26

50、 所示為各種樣式的按鈕被按下的107Bu tt on bu tt on = n ew Bu tt on ( s, SWT . TOGGLE ) ;/ TOGG按LE鈕bu tt on . s e t Te x t ( o Wo r l d ) ;bu tt on . s e t Too l T i pTe x t ( t h i s i s a bu tt on ) ;bu tt on . p ac k () ;/ /設(shè)置樣式 5Bu tt on bu t ton2 = new Bu tt on ( s, SWT .TOGGLE | SWT .FLAT ) ; / FLAT 按鈕bu tt o

51、n2 . s e tBound s ( bu t ton . g e tBounds () . x+bu tt on . g e t Bound s () . wi d t h*2 , bu tt on . g e t Bound s () . y , 50 , 50 ) ;bu tt on2 . s e t Te x t ( o Wo r l d ) ;/ /設(shè)置位置bu tt on2 . s e t Too l T i pTe x t ( t h i s i s a FLAT TOGGu tt on ) ;bu tt on2 . p ac k () ; 11Bu tt on bu tt o

52、n3 = n ew Bu tt on ( s, SWT . TOGGLE | SWT . BORDER) ;/ BORDER按鈕bu tt on3 . s e tBound s ( bu t ton2 . g e t Bound s () . x+bu t ton2 . g e t Bound s () . w i d t h*2 , bu tt on . g e t Bound s () . y , 50 ,1450 ) ;/ /設(shè)置按鈕的大小及位置bu tt on3 . s e t Te x t ( o Wo r l d ) ;/ /設(shè)置按鈕上的顯示文字bu tt on3 . s e t

53、Too l T i pTe x t ( t h i s i s a BORDER TOGGu tt on ) ;bu tt on3 . p ac k () ;Bu tt on bu tt on = n ew Bu tt on ( s, SWT . PUSH) ;bu tt on . s e t Te x t ( o Wo r l d ) ;bu tt on . s e t Too l T i pTe x t ( t h i s i s a bu tt on ) ;bu tt on . p ac k () ; 5Bu tt on bu tt on2 = n ew Bu tt on ( s, SW

54、T . FLAT ) ;/按鈕bu tt on2 . s e tBound s ( bu t ton . g e tBounds () . x+bu tt on . g e t Bound s () . wi d t h*2 , bu tt on . g e t Bound s () . y , 50 , 50 ) ;bu tt on2 . s e t Te x t ( o Wo r l d ) ;/ /設(shè)置位置bu tt on2 . s e t Too l T i pTe x t ( t h i s i s a FLAT bu tt on ) ;/ /設(shè)置樣式bu tt on2 . p ac

55、 k () ;/ /調(diào)整大小11Bu tt on bu tt on3 = n ew Bu tt on ( s, SWT . BORDER) ;bu tt on3 . s e tBound s ( bu t ton2 . g e t Bound s () . x+bu t ton2 . g e t Bound s () . w i d t h*2 , bu tt on . g e t Bound s () . y , 50 ,1450 ) ;bu tt on3 . s e t Te x t ( o Wo r l d ) ;bu tt on3 . s e t Too l T i pTe x t (

56、 t h i s i s a BORDER bu tt on ) ;bu tt on3 . p ac k () ;第 2 篇SWT 應(yīng)用狀態(tài)。對(duì)比圖 4-25,除了中間的平面按鈕樣式?jīng)]有改變之外,其他兩種按鈕都有向下凹陷的效果。3SWT.ARROW(箭頭按鈕)箭頭按鈕的樣式更類(lèi)似器中的一些按鈕。按鈕的箭頭是有方向的,如圖 4-27 所示,每個(gè)按鈕同樣有“SWT.PUSH”、“SWT.FLAT”和“SWT.BORDER”3 款樣式可以選擇。圖 4-26圖 4-27鎖定按鈕樣式箭頭按鈕4.5.2單選按鈕和復(fù)選框1單選按鈕(SWT.RADIO)在同一組中,單選按鈕每次只能有一個(gè)被選中,如圖 4-28

57、 所示。如何設(shè)定組需要涉及容器類(lèi)的概念。容器類(lèi)是一個(gè)比較復(fù)雜的概念,這里不深入展開(kāi),只需要明白其就是放置和取出各種對(duì)象,用于管理各種對(duì)象的類(lèi)。這里使用了 SWT 中的一個(gè)簡(jiǎn)單的容器“Group”(分組)。參考代碼如下:108Group group = new Group(s,SWT.SHADOW ETCHED OUT); /設(shè)定容器final FormData fd group = new FormData();fd_group.bottom = new FormAttaent(0, 122);圖 4-28單選按鈕Button button = new Button (s,SWT.ARROW|

58、SWT.ARROW UP); /上按鈕 button.setToolTipText(this is a ARROW button);button.pack();Button button2 = new Button (s,SWT.ARROW|SWT.DOWN);/下按鈕 button2.setBounds(button.getBounds().x+button.getBounds().width*2,button.getBounds().y, 50, 50); button2.setToolTipText(this is a ARROW DOWN button); button2.pack()

59、;Button button3 = new Button (s,SWT.ARROW|SWT.LEFT);/左按鈕 button3.setBounds(button2.getBounds().x+button2.getBounds().width*2,button.getBounds().y, 50,50); button3.setToolTipText(this is a ARROW LEFT button); button3.pack();Button button4 = new Button (s,SWT.ARROW|SWT.RIGHT);/右按鈕 button4.setBounds(bu

60、tton3.getBounds().x+button2.getBounds().width*2,button.getBounds().y, 50,50);button4.setToolTipText(this is a ARROW RIGHT button); button4.pack();第 4 章SWT 組件首先在第 1 行了一個(gè)“Group”類(lèi)作為所有單選按鈕的容器“group”。以后其中每一個(gè)單選按鈕都會(huì)將其設(shè)置為父類(lèi)。然后需要設(shè)置該“Group”類(lèi)的位置。這里使用“FormData”類(lèi)來(lái)控制“Control”類(lèi)的擺放,這里對(duì)比單選按鈕的分布方式,兩種分布都可以實(shí)現(xiàn),后面的例子將會(huì)“F

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論