SWT/JFace開發(fā)入門指南(三)〈轉(zhuǎn)帖〉
初步體驗
widget
?
從
Widget
和
Control
開始
Widget
是
Control
的父類,而
Control
是我們使用的大多數(shù)部件的父類。我們在以前的一些編程語言中可能接觸過
“
控件
”
或者
“
組件
”
之類的概念,部件(
widget
)的概念大體和這些相當。
在
org.eclipse.swt.widgets
中定義了眾多的
widget
,甚至我們前面介紹的
Shell
也被當成
widget
的一種。
因為可用的
widget
如此之多,所以我大概沒有辦法全部一一介紹。在這一節(jié)中,我會介紹幾種常用的
widget
。相信善于觸類旁通的你通過這些極為簡略的介紹應該可以開始使用各種
widget
,在使用中不斷完善自己的認識。
首先我們來介紹
Widget
。它是一個抽象類,也是所有
widget
的父類。通過介紹這個類,我們可以得出這所有
widget
的一些共有特性。
Widget
的方法中
dispose()
方法我們在以前曾經(jīng)見到過,調(diào)用這個方法時候,所謂的接收者(
receiver
,譬如我們這樣寫:
awidget.dispose()
,那么
awidget
就是接收者,而這句話所處的對象成為調(diào)用者或者
caller
)和接收者中所包含的其他
widget
會釋放它們所占用底層操作系統(tǒng)的資源。這也就是說你不必顯式地為程序中創(chuàng)建的每個
widget
進行
dispose()
調(diào)用,而只需要確保最外層的
widget
(比如
Display
)進行了
dispose()
就可以了。
另外還可以通過
isDisposed()
判斷是否該
widget
(接收者)已經(jīng)進行了
dispose
。
Widget
中的
getStyle()
方法得到
widget
的風格,而
getDisplay()
得到所處的
Display
對象。
此外
Widget
中還有兩個重要方法
getData()
和
setData()
,這兩個方法允許我們?yōu)橐粋€
widget
附加其他的信息。特別是在你需要跨模塊傳遞
widget
的時候,這個功能顯得非常有用。比如如果一個文本框中顯示了一段文章中的某句話,如果我們同時希望把這整篇文章的題目和作者附加上的話可以這樣寫:
atext.setData(“title”,”I Have A Dream”);
atext.setData(“author”,” Martin Luther King”);
|
代碼段
3
在程序的其他部分可以用
atext.getData(“title”)
得到這篇文章的題目,或者用
atext.getData(“author”)
得到作者。
在前面我們提到過,
Control
是今后我們所使用大部分
widget
的父類。在這里我不單獨進行介紹,而是在后面的部分中介紹。
創(chuàng)建部件
和創(chuàng)建其
他
java object
一樣,我們通過使用
new
操作符創(chuàng)建部件的實例。有一點比較特殊的可能你需要使用帶參數(shù)的構(gòu)造函數(shù)進行
new
操作。類似下面的程序:
Text text=new Text(shell,SWT.CENTER);
|
?
?
?
這種方法適用于幾乎所有的
widget
,其中第一個參數(shù)是父
widget
,也就是指明了該
widget
需要被放置道另外哪一個
widget
之中,而第二個參數(shù)是這個
widget
的風格。
大小和位置
僅僅創(chuàng)建一個部件并不足以讓你看到它,因為一個部件初始的長和寬都是 0 。你還需要設(shè)定它的大小。你可以用 setSize() 或者 setBounds() 方法手動設(shè)定部件的大小,也可以讓系統(tǒng)自動調(diào)整部件的大小到一個合適的值,這個值也被成為首選尺寸( preferred size )。
可以通過調(diào)用 pack() 方法讓系統(tǒng)調(diào)整控件大小。如果你希望系統(tǒng)自動調(diào)整,那么你需要首先設(shè)定控件需要表達的內(nèi)容。舉個例子來說,如果你的部件是一個文本框或者標簽,你應該首先設(shè)定它所要顯示的文本,這樣系統(tǒng)可以通過文本的長度計算。
對于部件的位置,同樣可以使用 setLocation() 或者 setBounds() 進行設(shè)定。
這里值得一提的是所謂的 bounds ,其實 bounds 可以看成是大小和尺寸的綜合。比如 setBounds(int x, int y,int width,int height) 的參數(shù)中, x 和 y 描述的是位置信息,而 width 和 height 描述了大小。
隱藏與失效
通過部件的 setVisible 方法可以控制部件進行隱藏或是顯示。通過 setEnabled 方法可以控制部件是否有效。一個無效的部件不會對用戶的任何動作作出響應。這兩個方法的參數(shù)都是布爾型的。
提示文本
可以通過
setToolTipText()
方法設(shè)定部件的提示文本。
幾種常用的部件
Label
標簽用來顯示靜態(tài)的文本或者圖像。關(guān)于圖像和色彩我會在后面的部分進行介紹。
標簽可以使用 SWT.CENTER, SWT.LEFT, SWT.RIGHT 中的一種指明文本的對齊方式(居中對齊,左對齊,右對齊)。
你也可以通過設(shè)置標簽屬性為 SWT. SEPARATOR 使標簽成為一條分隔符。
下面這個程序給出了標簽的兩種表現(xiàn)形式,其中使用了
Layout
,關(guān)于
Layout
的詳細情況也會在后面的部分進行介紹:
public class Labels {
?
??? public static void main(String[] args) {
??????? Display display = new Display();
??????? Shell shell = new Shell(display,SWT.SHELL_TRIM);
??????? RowLayout layout=new RowLayout(SWT.VERTICAL);
??????? shell.setLayout(layout);
??????? shell.setText("Labels");
??????? Label label1=new Label(shell,SWT.CENTER);
??????? label1.setText("Label Demo");
??????? Label label2=new Label(shell,SWT.SEPARATOR | SWT.HORIZONTAL);
??????? shell.setSize(100,100);
??????? shell.open();
?
?
?
??????? while (!shell.isDisposed()) {
??????????? if (!display.readAndDispatch()) {
??????????????? display.sleep();
???? ???????}
??????? }
??????? display.dispose();
??? }
}
|
代碼段 4
最后得到的效果可以參照下圖:
圖 4
Text
Text 就是最簡單的文本框,與標簽一樣,我們可以通過設(shè)定它的風格來表示它的對齊方式( SWT.CENTER , SWT.LEFT , SWT.RIGHT ),另外還有其他一些用于文本支持的方法,比如 insert() , paster() , copy() , setSelection() , selectAll() 等,這些方法在后面介紹 swt 事件模式會進行更詳細的介紹。
Button
在 swt 中, Button 并不僅僅是按鈕。構(gòu)造時候定義的風格不同,所體現(xiàn)出的外觀也不一樣。
如果風格定義成 SWT.PUSH ,它就是一個普通的按鈕。
如果定義為 SWT.TOGGLE ,它在被按下以后會保持按下的形狀(而不會彈起來),直到鼠標再次在上面按一下才會回復彈起的形狀。
如果風格定義為 SWT.ARROW ,它是一個帶箭頭的按鈕,箭頭的指向可以選擇 SWT.LEFT , SWT.RIGHT , SWT.UP , SWT.DOWN 中的一個。
如果定義為 SWT.CHECK ,它是一個復選框。
如果定義為 SWT.RADIO ,它是一個單選框。
下面一段程序演示了各種不同的
Button
。
public class Buttons {
?
?
?
??????? public static void main(String[] args) {
??????????? Display display = new Display();
??????????? Shell shell = new Shell(display,SWT.SHELL_TRIM);
??????????? RowLayout layout=new RowLayout(SWT.VERTICAL);
??????????? shell.setLayout(layout);
??????????? shell.setText("Buttons");
???????????
??????????? Button pushbutton=new Button(shell,SWT.PUSH | SWT.CENTER);
??????????? pushbutton.setText("SWT.PUSH");
?
?
?
??????????? Button togglebutton=new Button(shell,SWT.TOGGLE | SWT.LEFT);
??????????? togglebutton.setText("SWT.TOGGLE");
??????????? togglebutton.setSelection(true);
???????????
??????????? Button arrowbutton=new Button(shell,SWT.ARROW | SWT.LEFT);
???????????
???????????
??????????? Button checkbox=new Button(shell,SWT.CHECK);
??????????? checkbox.setText("SWT.CHECK");
?????????
??????????? Button radio=new Button(shell,SWT.RADIO);
??????????? radio.setText("SWT.RADIO");
??????????? radio.setSelection(true);
???????????
??????????? shell.pack();
??????????? shell.open();
?
?
?
??????????? while (!shell.isDisposed()) {
??????????????? if (!display.readAndDispatch()) {
??????????????????? display.sleep();
??????????????? }
??????????? }
??????????? display.dispose();???
??? }
}
|
代碼段 5
最后得到的窗口如下圖:
圖
5
小結(jié)
在這一節(jié)中我向大家介紹了 widget 的一些基本知識,還有幾種簡單的 widget 。你可能注意到這些描述僅僅限于外觀方面,如何讓 widget 和用戶交互起來呢?這需要我們處理各種用戶事件,在下一節(jié)中我會向大家介紹 swt 的事件模式。