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