幾種特殊的部件
好像因?yàn)榇蠹业谋г贡容^多,感覺這一段
csdn
的
blog
似乎又有恢復(fù)穩(wěn)定的跡象了,
^_^
。
前面的兩節(jié)中,我都沒有作一些詳細(xì)的介紹,而是推薦了兩篇文章給大家,可能你會(huì)覺得有點(diǎn)不習(xí)慣,不過我覺得作為一個(gè)軟件開發(fā)者來說,最重要的一個(gè)技能就是你要能夠找到自己所需要的資源。而在
swt
(
JFace
)開發(fā)方面呢,其實(shí)如果你能多看一看
eclipse
的聯(lián)機(jī)幫助和官方網(wǎng)站上的各種文檔的話,對(duì)你的開發(fā)一定會(huì)大有幫助。其實(shí)我也都是這樣一步一步慢慢熟悉了的。
在這一節(jié)中,我要向大家介紹幾種比較特殊的
widget
,包括
Composite
,
Menu
等。
Composite
其實(shí)我們已經(jīng)接觸過
Composite
了,我們前面介紹過
Shell
,
Shell
就是一種特殊的
Composite
。就如它的名字一樣,
Composite
指的是可以嵌套其他部件的一種部件。
我們先來看一段代碼,為了看起來更簡(jiǎn)明,我把
shell
創(chuàng)建之類的代碼都去掉了。
????????Composite?composite
=
new
?Composite(shell,SWT.V_SCROLL);
????????composite.setLayout(
new
?RowLayout(SWT.VERTICAL));
????????Text?text
=
new
?Text(composite,SWT.NONE);
????????text.setSize(
100
,
30
);
代碼段
9
這段程序意義不大,不過我們可以看出,
Composite
可以作為其他部件的
parent
,可以有自己的
Layout
。
我們?cè)谄渲卸x
composite
的風(fēng)格時(shí)候用到了
SWT.V_SCROLL
,這是用來做什么的呢?它是用來定義這個(gè)部件有縱向滾動(dòng)條的。當(dāng)然相應(yīng)當(dāng)
SWT.H_SCROLL
就定義了部件有橫向滾動(dòng)條。
那么什么樣的部件可以有滾動(dòng)條呢?只要是
org.eclipse.swt.widgets.Scrollable
的子類就可以使用這兩個(gè)風(fēng)格定義自己的滾動(dòng)條。這是我們順便提到的一點(diǎn)題外話。
如果你把上面的程序填充完整運(yùn)行一下的話會(huì)發(fā)現(xiàn)出來的樣子很難看。因?yàn)?/span>
Composite
本身是看不到的。而可以孤零零地看到一個(gè)突出的滾動(dòng)條在那里。所以實(shí)際上單獨(dú)使用
Composite
意義不是很大,我們可以使用它的一些子類。
打開
Composite
的
javadoc
,你會(huì)發(fā)現(xiàn)它的子類實(shí)在是太多了。我們只揀兩個(gè)介紹一下,
Group
和
TabFolder
。
比起
Composite
來,
Group
有一個(gè)邊框,你可以用
setText
方法設(shè)定它的標(biāo)題。所以這樣在視覺上會(huì)更好看一些。下面是一個(gè)
Group
的圖示:
圖
11
另外一種特殊
Composite
就是
TabFolder
,
TabFolder
允許我們定義標(biāo)簽頁式的窗體。就像下面圖示的那樣:
圖
12
我們?cè)趺丛O(shè)定各個(gè)標(biāo)簽?zāi)兀看鸢甘鞘褂?/span>
TabItem
。可以使用
TabItem
的
setControl
方法設(shè)定標(biāo)簽頁上的控件。但是這樣又出現(xiàn)了一個(gè)疑問,
setControl
中的參數(shù)不是數(shù)組,如果我們想設(shè)定好幾個(gè)控件應(yīng)該怎么辦呢?這個(gè)時(shí)候就用得上
Composite
了。我們可以首先建一個(gè)
Composite
實(shí)例,然后在里面添加控件,再把這個(gè)
Composite
實(shí)例本身作為參數(shù)傳遞給
TabItem
的
setControl
方法。
為了更清楚地說明,我們可以看一下下面這段代碼:
?1??public?class?TabFolderDemo?{
?2?
?3?????/**
?4??????*?@param?args
?5??????*/
?6?????public?static?void?main(String[]?args)?{
?7?????????Display?display?=?new?Display();
?8?
?9?????????Shell?shell?=?new?Shell(display,?SWT.DIALOG_TRIM);
10?????????shell.setLayout(new?RowLayout(SWT.HORIZONTAL));
11?????????shell.setText("TabFolder?Demo");
12?
13?????????TabFolder?tf?=?new?TabFolder(shell,?SWT.NONE);
14?????????tf.setLayout(new?FillLayout());
15?????????TabItem?ti?=?new?TabItem(tf,?SWT.NONE);
16?????????ti.setText("A?Simple?TalItem");
17?????????Composite?composite?=?new?Composite(tf,?SWT.NONE);
18?????????composite.setLayout(new?GridLayout(2,?true));
19?
20?????????for?(int?i?=?0;?i?<?3;?i++)?{
21?????????????Label?label?=?new?Label(composite,?SWT.RIGHT);
22?????????????Text?text?=?new?Text(composite,?SWT.NONE);
23?????????????label.setText("Text"?+?i?+?":");
24?
25?????????}
26?????????
27?????????ti.setControl(composite);
28?????????
29?????????shell.pack();
30?????????shell.open();
31?
32?????????while?(!shell.isDisposed())?{
33?????????????if?(!display.readAndDispatch())?{
34?????????????????display.sleep();
35?????????????}
36?????????}
37?????????display.dispose();
38?????}
39?}
40?
代碼段
10
菜單(
Menu
)
swt
中和菜單相關(guān)的兩個(gè)類是
Menu
和
MenuItem
。顧名思義,
Menu
代表的就是整個(gè)菜單,而
MenuItem
是菜單中一項(xiàng)一項(xiàng)的實(shí)體。打個(gè)不恰當(dāng)?shù)谋确絹碚f,
Menu
就好比一個(gè)書架,而
MenuItem
就是書架上一個(gè)一個(gè)的格子。
創(chuàng)建菜單
如果我們要?jiǎng)?chuàng)建一個(gè)菜單,可以根據(jù)下面步驟來進(jìn)行:
1.
?????
實(shí)例化一個(gè)
Menu
對(duì)象,
Menu
有好幾種格式的構(gòu)造函數(shù),你可以選擇一個(gè),比如像這樣:
?Menu?menu
=
new
?Menu(shell,SWT.BAR);
與其他部件不同的是,
Menu
的父控件并不一定需要是
Composite
,而是任何一個(gè)
Control
都可以。而
Menu
的風(fēng)格有幾種:
l
????????
SWT.POP_UP
:彈出式菜單
l
????????
SWT.BAR
:程序中的頂級(jí)菜單,比如我們通常看到的包含了
“
文件,編輯
”
之類的那個(gè)橫列的菜單欄
l
????????
SWT.DROP_DOWN
:下拉式菜單,比如我們?cè)?/span>
Word
點(diǎn)擊
“
文件
”
之后出現(xiàn)的子菜單就是一個(gè)典型的下拉式菜單。
注意
Menu
本身是沒有
setText
方法的,因?yàn)檫@些具體的顯示屬性你必須在相應(yīng)當(dāng)
MenuItem
中設(shè)定。
2.
?????
為
Menu
添加
MenuItem
對(duì)象,一個(gè)
MenuItem
的構(gòu)造函數(shù)如下所示:
MenuItem(Menu?parent,?
int
?style)
或者是:
?MenuItem(Menu?parent,?
int
?style,?
int
?index)
其中
parent
就是所屬的
Menu
,而
index
可以看成是排列順序。而
style
可以有以下幾種:
l
????????
SWT.PUSH
:就是一個(gè)普通道菜單項(xiàng),但是這樣的
MenuItem
不能有層疊的下一級(jí)菜單
l
????????
SWT.CASCADE:
這樣的
MenuItem
可以有層疊的下一級(jí)菜單。可以使用
MenuItem
的
setMenu
方法設(shè)定它的下一級(jí)菜單,作為參數(shù)的
Menu
風(fēng)格必須是
SWT.DROP_DOWN
l
????????
SWT. SEPARATOR:
分隔符,也就是一道橫線,這樣的
MenuItem
是沒有文字的,所以
setText
不起作用。
l
????????
SWT.CHECK:
菜單項(xiàng)前面有一個(gè)復(fù)選標(biāo)志。
l
????????
SWT.RADIO:
菜單項(xiàng)前面有單選標(biāo)志。
下面的圖示說明了各種風(fēng)格不同的
Menu
和
MenuItem
圖
13
3.
?????
為有下級(jí)菜單的
MenuItem
(風(fēng)格必須為
SWT.CASCADE
)設(shè)定下級(jí)菜單的
Menu
對(duì)象(用
setMenu
方法),當(dāng)然了,你仍然需要為這個(gè)下一級(jí)的
Menu
設(shè)定其中的
MenuItem
4.
?????
如果你的菜單風(fēng)格式
SWT.BAR
,你還需要調(diào)用
Shell
的
setMenuBar
(參數(shù)就是頂級(jí)菜單)方法設(shè)定窗體菜單。如果是彈出式菜單也就是
SWT.POP_UP
,你需要調(diào)用所在控件的
setMenu
方法設(shè)定彈出菜單為該菜單。
處理菜單事件
菜單的事件處理最主要的還是選擇菜單項(xiàng)時(shí)候要進(jìn)行的一些動(dòng)作,我們可以用
SelectionListener
進(jìn)行處理。你也可以為菜單展開的事件添加
ArmListener
。
下面這段簡(jiǎn)單的代碼展示了一個(gè)只有退出程序功能的文件菜單。
?1?public?class?MenuDemo?{
?2?
?3?????private?Shell?_shell;
?4?
?5?????/**
?6??????*?@return?Returns?the?_shell.
?7??????*/
?8?????public?Shell?getShell()?{
?9?????????return?_shell;
10?????}
11?
12?????/**
13??????*?@param?_shell
14??????*????????????The?_shell?to?set.
15??????*/
16?????public?void?setShell(Shell?shell)?{
17?????????this._shell?=?shell;
18?????}
19?
20?????public?MenuDemo()?{
21?????????Display?display?=?new?Display();
22?????????Shell?shell?=?new?Shell(display,?SWT.SHELL_TRIM);
23?????????setShell(shell);
24?????????shell.setLayout(new?RowLayout(SWT.HORIZONTAL));
25?????????shell.setText("Menu?Demo");
26?
27?????????Menu?menubar?=?new?Menu(shell,?SWT.BAR);
28?????????MenuItem?fileitem?=?new?MenuItem(menubar,?SWT.CASCADE);
29?????????fileitem.setText("&File");
30?
31?????????Menu?filemenu?=?new?Menu(shell,?SWT.DROP_DOWN);
32?????????fileitem.setMenu(filemenu);
33?????????MenuItem?exititem?=?new?MenuItem(filemenu,?SWT.PUSH);
34?????????exititem.setText("&Exit");
35?????????exititem.addSelectionListener(new?SelectionAdapter()?{
36?????????????@Override
37?????????????public?void?widgetSelected(SelectionEvent?arg0)?{
38?????????????????MessageBox?messagebox?=?new?MessageBox(getShell(),?SWT.YES?|?SWT.NO);
39?????????????????messagebox.setText("Exit");
40?????????????????messagebox.setMessage("Exit?the?program?");
41???????????????
42?????????????????int?val=messagebox.open();
43?????????????????if(val?==?SWT.YES)
44?????????????????{
45?????????????????????getShell().close();
46?????????????????}
47?????????????}
48?
49?????????});
50?????????shell.setMenuBar(menubar);
51?????????shell.setSize(800,?300);
52?????????shell.open();
53?
54?????????while?(!shell.isDisposed())?{
55?????????????if?(!display.readAndDispatch())?{
56?????????????????display.sleep();
57?????????????}
58?????????}
59?????????display.dispose();
60?????}
61?
62?????public?static?void?main(String[]?args)?{
63?
64?????????MenuDemo?demo=new?MenuDemo();
65?????}
66?
67?}
68?
代碼段
11
加速鍵
在使用
MenuItem
的
setText
方法時(shí),可以在希望設(shè)為加速鍵的字母前面標(biāo)
&
,比如
exititem.setText(
"
&Exit
"
);
就標(biāo)明了這個(gè)退出菜單項(xiàng)的加速鍵為
E
。
另外也可以使用
setAccelerator
方法設(shè)定加速鍵。
ToolBar
和
CoolBar
在這里,我要向大家說一聲
sorry
了,因?yàn)槲也⒉淮蛩阍谶@里詳細(xì)介紹
Toolbar
的各種用法,這主要有兩個(gè)原因:
1.
?????????
工具欄的用法和菜單是類似的,菜單是在實(shí)例化一個(gè)
Menu
對(duì)象以后添加
MenuItem
,而工具欄則是在實(shí)例化
ToolBar
以后添加
ToolItem
(或者實(shí)例化
CoolBar
以后添加
CoolItem
)。甚至它們的一些風(fēng)格,事件也很類似。如果你對(duì)照著
ToolBar
和
ToolItem
(
CoolBar,CoolItem
)的
API
文檔以及前面我對(duì)菜單用法的介紹看到話,很快就能比較熟悉工具條的用法。
2.
?????????
我們?cè)诤竺娼榻B
JFace
的時(shí)候,你會(huì)發(fā)現(xiàn)有更簡(jiǎn)單的辦法創(chuàng)建菜單和工具條。
小結(jié)
這一節(jié)介紹了幾種有限的部件,關(guān)于
swt
的介紹到這一節(jié)為止就暫時(shí)告一段落了。在以后的部分我會(huì)開始給大家介紹
JFace
。當(dāng)然了,這并不意味著以后再也沒有
swt
的內(nèi)容介紹給大家了,只是我覺得到現(xiàn)在為止,大家應(yīng)該已經(jīng)可以寫一些簡(jiǎn)單的
swt
程序了,我如果再多介紹,就類似于對(duì)
API
文檔的翻譯了。當(dāng)然如果以后有充足的時(shí)間的話,我也希望能夠向大家多介紹一些相關(guān)的內(nèi)容。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=380786