第7章SWT控件詳解_第1頁
第7章SWT控件詳解_第2頁
第7章SWT控件詳解_第3頁
第7章SWT控件詳解_第4頁
第7章SWT控件詳解_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章SWT控件詳解上一章學(xué)習(xí)了如何用SWT小部件制作GUI界面,這一章則詳細(xì)講解一些主要部件的使用。SWT的部件非常豐富,要在有限的篇幅中詳細(xì)講解每一個部件是非常困難的。而且Eclipse的幫助系統(tǒng)提供了詳細(xì)的部件API參考手冊,所以本書也盡量不重復(fù)參考手冊中的內(nèi)容,而是通過一些在開發(fā)中經(jīng)常遇到的應(yīng)用實例,對常用的部件進(jìn)行講解。另外,SWT中,很多部件的使用都是大同小異的,學(xué)習(xí)過一些常用的部件,其他部件也很容易理解。7.1用Composite制作可重用部件在SWT的JavaDoc中,對Composite的介紹非常簡單:“Composite的實例是一個可以用來容納其他控件的控件?!痹趯嶋H應(yīng)用中,Composite的用途可不是一句話這么簡單。在實際應(yīng)用中,Composite非常重要,可以用來建造新的、可重用的部件。7.1.1部件重用的原理Composite可以作為一個基本的容器,把一組界面封裝起來,做成Bean,可以實現(xiàn)界面的重用。例如同樣一個界面,通過Composite封裝后,就可以當(dāng)作一個新部件,可以應(yīng)用在窗口中、也可以應(yīng)用到對話框中、或者應(yīng)用到向?qū)е?,如果是制作Eclipse的插件,還可以放置到視圖中。7.1.2重載新的Composite下面按照這種思想建立一個可重用的部件。按照下面的代碼建立一個類Composite001,這個類繼承Composite。7.1.3可重用賬號密碼部件的設(shè)計現(xiàn)在這個Composite001里面還只是一個空白的部件,什么輸入功能都沒有。下面要把它變成一個賬號密碼部件。7.1.4初始化Composite的子部件先按照下面代碼修改initialize()方法。在這個方法中按照前面圖7-3的設(shè)置添加了多個部件:三個顯示輸入框名稱的Label,兩個顯示提示信息的Label,三個文本輸入框Text。7.2GridLayout詳解GridLayout,顧名思義,就是網(wǎng)格布局。在一個容易上劃分多行多列,部件放置到指定的單元格中,從而實現(xiàn)整齊的布局。GridLayout是SWT中使用頻率最高的布局模式,相對與其他Layout對象,使用起來復(fù)雜一點。下面就來詳細(xì)學(xué)習(xí)一下如何使用GridLayout。7.2.1GridLayout的布局方式在前面7.1.4小節(jié)的示例中,已經(jīng)用GridLayout建立了布局。正如initialize()方法的前兩行代碼,初始化了一個GridLayout。GridLayoutgridLayout=newGridLayout();GridLayout.numColumns=3;7.2.2設(shè)置GridLayout的屬性GridLayout還有其他屬性,對布局作更多的設(shè)置。常用的屬性有:marginHeight、marginWidth、horizontalSpacing、verticalSpacing。marginHeight:marginWidth:horizontalSpacing:verticalSpacing:7.2.2設(shè)置GridLayout的屬性7.2.3單元格和GridDataGridData告訴GridLayout,對應(yīng)的部件如何放置到GridLayout的單元格中。下面是GridData的常用屬性,圖7-6說明了這些屬性的對應(yīng)設(shè)置的用途。grabExcessHorizontalSpace:grabExcessVerticalSpace:horizontalAlignment:horizontalIndent:horizontalSpan:verticalAlignment:verticalIndent:verticalSpan:heightHint:widthHint:7.3Text單行文本輸入框按照上面的代碼,把一個Composite部件布局好。雖然這個界面部件就可以使用了,但是要滿足實際應(yīng)用,還需要加上更多的交互功能。例如用戶賬號有效性的驗證,按照設(shè)計,用戶賬號只能是英文大小寫字母和數(shù)字、下劃線的組合。還有密碼輸入框的掩飾顯示,不能讓密碼直接顯示出來。要實現(xiàn)這些功能,就要對Text部件進(jìn)行更多的處理。7.3.1密碼輸入框普通文本輸入框變成密碼輸入框很簡單。首先在初始化的時候加入SWT.PASSWORD樣式;然后,用setEchoChar()屬性設(shè)置密碼掩飾符。如下面代碼那樣,給password和passcheck加上密碼掩飾符,同時設(shè)置密碼長度不能超過16個字符。password=newText(this,SWT.BORDER|SWT.PASSWORD);password.setEchoChar('*');password.setTextLimit(16);passcheck=newText(this,SWT.BORDER|SWT.PASSWORD);passcheck.setEchoChar('*');passcheck.setTextLimit(16);7.3.2監(jiān)聽輸入框中內(nèi)容的修改一旦應(yīng)用了SWT.PASSWORD樣式,Text文本框就只能輸入英文字符集內(nèi)的字符了。但是密碼不能少于6位,密碼少于6位,就要在旁邊提示信息中顯示錯誤警告。要實現(xiàn)這個功能,首先給密碼輸入框添加一個ModifyListener(修改監(jiān)聽器)。7.3.3限制輸入字符用戶賬號,限制只能輸入英文和數(shù)字,包括下劃線或者減號。要實現(xiàn)這個功能,就要使用VerifyListener。Verify事件是控件獲得用戶輸入之后,在保存用戶輸入的文本內(nèi)容前觸發(fā)的事件。看上去好像和Modify事件差不多,都是在用戶輸入之后。Verify在Modify事件之前。7.4Label的用途Label也是個使用非常頻繁的部件,在界面上需要用它來顯示一些文字信息,例如最常用的就是說明界面上某個輸入字段的名稱。在SWT中,Label的用途還有很多。例如作為GridLayout中的占位部件,還可以用作分隔線。7.4.1簡單標(biāo)簽最簡單的標(biāo)簽就是顯示文本信息,構(gòu)造的時候不需要設(shè)置任何樣式和屬性。樣式參數(shù)給一個SWT.NONE參數(shù)就可以了。然后用setText方法設(shè)置顯示的文本。SWT的Label不會根據(jù)字符的變化自動伸展。7.4.2Label和CLabel在這個例子中,還可以看到另外一個標(biāo)簽部件CLabel。Label有一個缺陷,雖然具有setImage(Imageimage)這個方法,可以在標(biāo)簽上顯示圖標(biāo),但是一旦設(shè)置圖標(biāo),就不能同時顯示文字信息了。另外一個部件CLabel就解決了這個問題,可以同時顯示圖標(biāo)和文字信息。7.4.3設(shè)置字體的顏色設(shè)置字體的顏色用setForeground(Colorcolor)方法,設(shè)置背景顏色用setBackground(Colorcolor)方法。在前面介紹SWT部件的繼承關(guān)系時候,可以看到,Label等等部件都是繼承自Control的,而setForeground和setBackground都是Control中就實現(xiàn)的方法,所以所有繼承自Control的部件都有這兩個方法設(shè)置字體的顏色和背景顏色。顏色的定義用的是Color對象。在后面關(guān)于SWT繪圖的內(nèi)容中會詳細(xì)說明Color的使用。一般的應(yīng)用可以不需要自己構(gòu)造Color對象。在SWT中,已經(jīng)預(yù)先定義了一批系統(tǒng)顏色。正如在例子中那樣。用Display.getCurrent().getSystemColor(intcolor)這個靜態(tài)方法就可以獲得預(yù)定義的Color對象。getSystemColor的參數(shù)來自SWT中預(yù)定義的常量:COLOR_BLACK、。。。。。參考手冊7.4.4標(biāo)簽的妙用在這個例子中,還看到標(biāo)簽的另外一種用法,就是把標(biāo)簽部件當(dāng)作分隔線使用。要把標(biāo)簽變成分隔線只要構(gòu)造的時候賦予SWT.SEPARATOR樣式、以及分隔線的類型。例如:newLabel(this,SWT.SEPARATOR|SWT.HORIZONTAL);//這是橫向分隔線;newLabel(this,SWT.SEPARATOR|SWT.VERTICAL);//這是豎線。7.5Group的應(yīng)用下面再繼續(xù)制作一個部件,這是一個輸入員工資料的輸入面板。在這個輸入面板上,布滿大量的輸入字段,除了簡單的文本輸入框,還有單選框(RadioButton),下拉列表(Combo)。為了更好地組織這些輸入字段,使用了Group部件來進(jìn)行分組。通過制作這個部件,將會接觸到幾個新的SWT部件。包括Group、RadioButton。首先來學(xué)習(xí)一下Group的應(yīng)用。7.5.1添加Group首先依然還是像前面的例子那樣,先重載一個Composite。建立一些基本的方法,包括initlize()。根據(jù)需要還可以加上main()方法。main()方法復(fù)制上一個例子的就可以了。在這個例子中,將建立一個輸入個人基本信息的編輯面板。面板左邊是個人資料,包括姓名、性別、生日、身份證和學(xué)歷。右邊是關(guān)于工作的基本信息,包括工號、入職時間、職位、部門等等。7.5.2在Group上添加子部件在Group添加子部件需要做兩步,第一步是設(shè)置Group部件的布局方式,第二步是在構(gòu)造子部件時,把Group部件作為parent參數(shù)。7.6Button和Text的其他用法在這個例子中,還出現(xiàn)了幾個新的部件RadioButton和TextArea、Spinner。其實Radio和TextArea都不是新的部件,RadioButton是Button的另外一種形態(tài),TextArea是Text的另外一種形態(tài)。下面詳細(xì)學(xué)習(xí)一下,如何通過設(shè)置Button好Text的樣式來建立這些“變種”的部件。7.6.1Button的樣式要把Button作為Radio使用,只要在構(gòu)造的時候設(shè)定style參數(shù)為SWT.RADIO就可以了。Button還可以作為其他幾種部件來使用。ARROW:CHECK:PUSH:RADIO:TOGGLE:7.6.2Button作為Radio使用作為Radio使用時,因為Radio也叫單選按鈕,在一個容器部件中,如果出現(xiàn)多個Radio,那么永遠(yuǎn)只有一個處于選擇狀態(tài)。要判斷那個處于選擇狀態(tài),就要進(jìn)行判斷。例如在前面的例子中,要獲得性別的選擇,可以類似下面寫一個獲得性別選項的方法:publicbooleangetGender(){if(radioMale.getSelection()){//獲得單選框的選擇狀態(tài),進(jìn)行判斷,如果被選擇,則返回truereturntrue;}if(radioFemale.getSelection()){returnfalse;}returntrue;}7.6.3Button作為檢查框CheckBox下面是Button作為檢查框的簡單例子。只要將Button對象設(shè)置為SWT.CHECK屬性就可以了。setText則是設(shè)置檢查框右邊顯示的文本內(nèi)容。checkBox=newButton(this,SWT.CHECK);//建立檢查框checkBox.setText("Checkbox");//設(shè)置檢查框的文本標(biāo)簽判斷檢查框的勾選狀態(tài)用也是用getSelection()方法,被勾選,返回true,沒有被勾選,返回false。設(shè)置選擇狀態(tài)則是用setSelection()方法。7.6.4Button作為箭頭按鈕把Button用作箭頭按鈕時,除了要設(shè)置SWT.ARROW樣式外,還要同時組合使用SWT.CENTER、SWT.DOWN、SWT.LEFT、SWT.RIGHT幾個樣式。這個幾個樣式分別代表不同方向的箭頭。下面的代碼演示了幾種箭頭按鈕的應(yīng)用。arrowUP=newButton(this,SWT.ARROW|SWT.CENTER);Button(this,SWT.ARROW|SWT.DOWN);arrowLeft=newButton(this,SWT.ARROW|SWT.LEFT);arrowRight=newButton(this,SWT.ARROW|SWT.RIGHT);7.6.4Text作為TextArea使用在用戶界面中,還有一個常用的部件就是多行文本輸入框,通常稱為TextArea。在其他一些UI系統(tǒng)中,TextArea可能是單獨一種不見,而在Eclipse中,則是通過Text來實現(xiàn),只要在構(gòu)造Text的時候,添加SWT.MULTI樣式,就是一個TextArea多行文本輸入框了。7.7TabFolder的應(yīng)用選項卡也是常用的用戶界面。如果一個界面中有大量輸入字段,最好的方法就是把這些輸入字段進(jìn)行分類,分成多個選項卡顯示。在Eclipse中,用于建立選項卡的部件是TabFolder。單獨依靠TabFolder還不能實現(xiàn)選項卡的功能,還需要TabItem的配合。下面就來學(xué)習(xí)使用TabFolder好TabItem建立選項卡。7.7.1建立TabFolder在這個例子中,要把前面制作的一系列Composite部件,通過TabFolder組合成一個編輯個人資料的編輯面板。7.7.3TabFolder的應(yīng)用步驟在這個例子中,initTabs()方法負(fù)責(zé)建立選項卡。TabFolder的應(yīng)用過程大概可以分成下面幾步:第一步:建立TabFolder部件對象。tabFolder=newTabFolder(this,SWT.NONE);第二步:建立TabItem。第三步:以TabFolder作為parent參數(shù)建立每一頁的部件。第四步:調(diào)用TabItem的setControl方法(),把第三步建立的子部件關(guān)聯(lián)到對應(yīng)的TabItem中。7.7.4TabItem的使用從例子中也可以看到,建立選項卡部件的關(guān)鍵是TabItem的使用。TabItem有下面幾個關(guān)鍵的方法:publicvoidsetControl(Controlcontrol)publicvoidsetImage(Imageimage)publicvoidsetText(Stringstring)publicvoidsetToolTipText(Stringstring)7.7.5在底端顯示活頁標(biāo)簽?zāi)J(rèn)情況下,活頁的標(biāo)簽是顯示在上方的。只要在構(gòu)建TabFolder的時候,添加SWT.BOTTOM樣式,就可以讓標(biāo)簽顯示在下方。7.8菜單和工具欄前面建立的都是一些輸入部件,這些部件只能作為應(yīng)用程序中的一部分來使用。要建立一個真正的GUI應(yīng)用程序,還需要建立一個應(yīng)用程序窗口。在這個應(yīng)用程序窗口中,需要有菜單和工具欄。下面就來學(xué)習(xí)一下SWT是如何實現(xiàn)菜單和工具欄的。7.8.1建立包含菜單和工具欄的程序在窗口中建立菜單欄的過程有點繁瑣。在這個例子中,將建立一個瀏覽器程序,程序的中間是一個瀏覽器部件Browser,上面是菜單和工具欄。7.8.2建立菜單欄現(xiàn)在這段代碼只是編寫了一個框架,createMenu()和createToolBar()都還沒有實現(xiàn)。先來實現(xiàn)菜單。要建立菜單,需要使用Menu和MenuItem。建立菜單欄大概分成下面幾個步驟:第一步,新建一個Menu對象,設(shè)置為shell的menubar,這個Menu對象就成為窗口的菜單欄了;第二步,為這個菜單欄添加多個MenuItem,這些MenuItem就是菜單欄上的各個子菜單;第三步,分別以這些MenuItem為parent參數(shù),建立Menu對象,并用MenuItem的setMenu()方法建立關(guān)聯(lián);第四步,分別為每個MenuItem中的Menu對象添加菜單命令,每個菜單命令是一個MenuItem對象。如果需要建立子菜單,重復(fù)上面第二步開始的過程。7.8.3Menu和MenuItem的樣式Menu和MenuItem各自都有多種樣式,例如在上面建立菜單欄的時候,要把Menu設(shè)置為菜單欄,樣式就是BAR,下面是Menu的樣式:BAR:DROP_DOWN:POP_UP:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論