初步體驗
widget
?
從
Widget
和
Control
開始
Widget
是
Control
的父類,而
Control
是我們使用的大多數部件的父類。我們在以前的一些編程語言中可能接觸過
“
控件
”
或者
“
組件
”
之類的概念,部件(
widget
)的概念大體和這些相當。
在
org.eclipse.swt.widgets
中定義了眾多的
widget
,甚至我們前面介紹的
Shell
也被當成
widget
的一種。
因為可用的
widget
如此之多,所以我大概沒有辦法全部一一介紹。在這一節中,我會介紹幾種常用的
widget
。相信善于觸類旁通的你通過這些極為簡略的介紹應該可以開始使用各種
widget
,在使用中不斷完善自己的認識。
首先我們來介紹
Widget
。它是一個抽象類,也是所有
widget
的父類。通過介紹這個類,我們可以得出這所有
widget
的一些共有特性。
Widget
的方法中
dispose()
方法我們在以前曾經見到過,調用這個方法時候,所謂的接收者(
receiver
,譬如我們這樣寫:
awidget.dispose()
,那么
awidget
就是接收者,而這句話所處的對象成為調用者或者
caller
)和接收者中所包含的其他
widget
會釋放它們所占用底層操作系統的資源。這也就是說你不必顯式地為程序中創建的每個
widget
進行
dispose()
調用,而只需要確保最外層的
widget
(比如
Display
)進行了
dispose()
就可以了。
另外還可以通過
isDisposed()
判斷是否該
widget
(接收者)已經進行了
dispose
。
Widget
中的
getStyle()
方法得到
widget
的風格,而
getDisplay()
得到所處的
Display
對象。
此外
Widget
中還有兩個重要方法
getData()
和
setData()
,這兩個方法允許我們為一個
widget
附加其他的信息。特別是在你需要跨模塊傳遞
widget
的時候,這個功能顯得非常有用。比如如果一個文本框中顯示了一段文章中的某句話,如果我們同時希望把這整篇文章的題目和作者附加上的話可以這樣寫:
atext.setData(“title”,”I Have A Dream”);
atext.setData(“author”,” Martin Luther King”);
|
代碼段
3
在程序的其他部分可以用
atext.getData(“title”)
得到這篇文章的題目,或者用
atext.getData(“author”)
得到作者。
在前面我們提到過,
Control
是今后我們所使用大部分
widget
的父類。在這里我不單獨進行介紹,而是在后面的部分中介紹。
創建部件
和創建其
他
java object
一樣,我們通過使用
new
操作符創建部件的實例。有一點比較特殊的可能你需要使用帶參數的構造函數進行
new
操作。類似下面的程序:
Text text=new Text(shell,SWT.CENTER);
|
?
?
?
這種方法適用于幾乎所有的
widget
,其中第一個參數是父
widget
,也就是指明了該
widget
需要被放置道另外哪一個
widget
之中,而第二個參數是這個
widget
的風格。
大小和位置
僅僅創建一個部件并不足以讓你看到它,因為一個部件初始的長和寬都是
0
。你還需要設定它的大小。你可以用
setSize()
或者
setBounds()
方法手動設定部件的大小,也可以讓系統自動調整部件的大小到一個合適的值,這個值也被成為首選尺寸(
preferred size
)。
可以通過調用
pack()
方法讓系統調整控件大小。如果你希望系統自動調整,那么你需要首先設定控件需要表達的內容。舉個例子來說,如果你的部件是一個文本框或者標簽,你應該首先設定它所要顯示的文本,這樣系統可以通過文本的長度計算。
對于部件的位置,同樣可以使用
setLocation()
或者
setBounds()
進行設定。
這里值得一提的是所謂的
bounds
,其實
bounds
可以看成是大小和尺寸的綜合。比如
setBounds(int x, int y,int width,int height)
的參數中,
x
和
y
描述的是位置信息,而
width
和
height
描述了大小。
隱藏與失效
通過部件的
setVisible
方法可以控制部件進行隱藏或是顯示。通過
setEnabled
方法可以控制部件是否有效。一個無效的部件不會對用戶的任何動作作出響應。這兩個方法的參數都是布爾型的。
提示文本
可以通過
setToolTipText()
方法設定部件的提示文本。
幾種常用的部件
Label
標簽用來顯示靜態的文本或者圖像。關于圖像和色彩我會在后面的部分進行介紹。
標簽可以使用
SWT.CENTER, SWT.LEFT, SWT.RIGHT
中的一種指明文本的對齊方式(居中對齊,左對齊,右對齊)。
你也可以通過設置標簽屬性為
SWT. SEPARATOR
使標簽成為一條分隔符。
下面這個程序給出了標簽的兩種表現形式,其中使用了
Layout
,關于
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
最后得到的效果可以參照下圖:
aspectratio="t" v:ext="edit">
圖
4
Text
Text
就是最簡單的文本框,與標簽一樣,我們可以通過設定它的風格來表示它的對齊方式(
SWT.CENTER
,
SWT.LEFT
,
SWT.RIGHT
),另外還有其他一些用于文本支持的方法,比如
insert()
,
paster()
,
copy()
,
setSelection()
,
selectAll()
等,這些方法在后面介紹
swt
事件模式會進行更詳細的介紹。
Button
在
swt
中,
Button
并不僅僅是按鈕。構造時候定義的風格不同,所體現出的外觀也不一樣。
如果風格定義成
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
小結
在這一節中我向大家介紹了
widget
的一些基本知識,還有幾種簡單的
widget
。你可能注意到這些描述僅僅限于外觀方面,如何讓
widget
和用戶交互起來呢?這需要我們處理各種用戶事件,在下一節中我會向大家介紹
swt
的事件模式。