幾種特殊的部件
好像因為大家的抱怨比較多,感覺這一段
csdn
的
blog
似乎又有恢復穩定的跡象了,
^_^
。
前面的兩節中,我都沒有作一些詳細的介紹,而是推薦了兩篇文章給大家,可能你會覺得有點不習慣,不過我覺得作為一個軟件開發者來說,最重要的一個技能就是你要能夠找到自己所需要的資源。而在
swt
(
JFace
)開發方面呢,其實如果你能多看一看
eclipse
的聯機幫助和官方網站上的各種文檔的話,對你的開發一定會大有幫助。其實我也都是這樣一步一步慢慢熟悉了的。
在這一節中,我要向大家介紹幾種比較特殊的
widget
,包括
Composite
,
Menu
等。
Composite
其實我們已經接觸過
Composite
了,我們前面介紹過
Shell
,
Shell
就是一種特殊的
Composite
。就如它的名字一樣,
Composite
指的是可以嵌套其他部件的一種部件。
我們先來看一段代碼,為了看起來更簡明,我把 shell 創建之類的代碼都去掉了。
????????composite.setLayout( new ?RowLayout(SWT.VERTICAL));
????????Text?text = new ?Text(composite,SWT.NONE);
????????text.setSize( 100 , 30 );
代碼段 9
這段程序意義不大,不過我們可以看出,
Composite
可以作為其他部件的
parent
,可以有自己的
Layout
。
我們在其中定義
composite
的風格時候用到了
SWT.V_SCROLL
,這是用來做什么的呢?它是用來定義這個部件有縱向滾動條的。當然相應當
SWT.H_SCROLL
就定義了部件有橫向滾動條。
那么什么樣的部件可以有滾動條呢?只要是
org.eclipse.swt.widgets.Scrollable
的子類就可以使用這兩個風格定義自己的滾動條。這是我們順便提到的一點題外話。
如果你把上面的程序填充完整運行一下的話會發現出來的樣子很難看。因為
Composite
本身是看不到的。而可以孤零零地看到一個突出的滾動條在那里。所以實際上單獨使用
Composite
意義不是很大,我們可以使用它的一些子類。
打開
Composite
的
javadoc
,你會發現它的子類實在是太多了。我們只揀兩個介紹一下,
Group
和
TabFolder
。
比起 Composite 來, Group 有一個邊框,你可以用 setText 方法設定它的標題。所以這樣在視覺上會更好看一些。下面是一個 Group 的圖示:
圖 11
另外一種特殊 Composite 就是 TabFolder , TabFolder 允許我們定義標簽頁式的窗體。就像下面圖示的那樣:
圖 12
我們怎么設定各個標簽呢?答案是使用
TabItem
。可以使用
TabItem
的
setControl
方法設定標簽頁上的控件。但是這樣又出現了一個疑問,
setControl
中的參數不是數組,如果我們想設定好幾個控件應該怎么辦呢?這個時候就用得上
Composite
了。我們可以首先建一個
Composite
實例,然后在里面添加控件,再把這個
Composite
實例本身作為參數傳遞給
TabItem
的
setControl
方法。
為了更清楚地說明,我們可以看一下下面這段代碼:
?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
中和菜單相關的兩個類是
Menu
和
MenuItem
。顧名思義,
Menu
代表的就是整個菜單,而
MenuItem
是菜單中一項一項的實體。打個不恰當的比方來說,
Menu
就好比一個書架,而
MenuItem
就是書架上一個一個的格子。
創建菜單
如果我們要創建一個菜單,可以根據下面步驟來進行:
1.
?????
實例化一個
Menu
對象,
Menu
有好幾種格式的構造函數,你可以選擇一個,比如像這樣:
與其他部件不同的是,
Menu
的父控件并不一定需要是
Composite
,而是任何一個
Control
都可以。而
Menu
的風格有幾種:
l
????????
SWT.POP_UP
:彈出式菜單
l
????????
SWT.BAR
:程序中的頂級菜單,比如我們通常看到的包含了
“
文件,編輯
”
之類的那個橫列的菜單欄
l
????????
SWT.DROP_DOWN
:下拉式菜單,比如我們在
Word
點擊
“
文件
”
之后出現的子菜單就是一個典型的下拉式菜單。
注意
Menu
本身是沒有
setText
方法的,因為這些具體的顯示屬性你必須在相應當
MenuItem
中設定。
2.
?????
為
Menu
添加
MenuItem
對象,一個
MenuItem
的構造函數如下所示:
或者是:
其中
parent
就是所屬的
Menu
,而
index
可以看成是排列順序。而
style
可以有以下幾種:
l
????????
SWT.PUSH
:就是一個普通道菜單項,但是這樣的
MenuItem
不能有層疊的下一級菜單
l ???????? SWT.CASCADE: 這樣的 MenuItem 可以有層疊的下一級菜單。可以使用 MenuItem 的 setMenu 方法設定它的下一級菜單,作為參數的 Menu 風格必須是 SWT.DROP_DOWN
l
????????
SWT. SEPARATOR:
分隔符,也就是一道橫線,這樣的
MenuItem
是沒有文字的,所以
setText
不起作用。
l
????????
SWT.CHECK:
菜單項前面有一個復選標志。
l
????????
SWT.RADIO:
菜單項前面有單選標志。
下面的圖示說明了各種風格不同的 Menu 和 MenuItem
圖
13
3. ????? 為有下級菜單的 MenuItem (風格必須為 SWT.CASCADE )設定下級菜單的 Menu 對象(用 setMenu 方法),當然了,你仍然需要為這個下一級的 Menu 設定其中的 MenuItem
4.
?????
如果你的菜單風格式
SWT.BAR
,你還需要調用
Shell
的
setMenuBar
(參數就是頂級菜單)方法設定窗體菜單。如果是彈出式菜單也就是
SWT.POP_UP
,你需要調用所在控件的
setMenu
方法設定彈出菜單為該菜單。
處理菜單事件
菜單的事件處理最主要的還是選擇菜單項時候要進行的一些動作,我們可以用 SelectionListener 進行處理。你也可以為菜單展開的事件添加 ArmListener 。
下面這段簡單的代碼展示了一個只有退出程序功能的文件菜單。
?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 方法時,可以在希望設為加速鍵的字母前面標 & ,比如
就標明了這個退出菜單項的加速鍵為 E 。
另外也可以使用 setAccelerator 方法設定加速鍵。
ToolBar 和 CoolBar
在這里,我要向大家說一聲 sorry 了,因為我并不打算在這里詳細介紹 Toolbar 的各種用法,這主要有兩個原因:
1. ????????? 工具欄的用法和菜單是類似的,菜單是在實例化一個 Menu 對象以后添加 MenuItem ,而工具欄則是在實例化 ToolBar 以后添加 ToolItem (或者實例化 CoolBar 以后添加 CoolItem )。甚至它們的一些風格,事件也很類似。如果你對照著 ToolBar 和 ToolItem ( CoolBar,CoolItem )的 API 文檔以及前面我對菜單用法的介紹看到話,很快就能比較熟悉工具條的用法。
2. ????????? 我們在后面介紹 JFace 的時候,你會發現有更簡單的辦法創建菜單和工具條。
小結
這一節介紹了幾種有限的部件,關于
swt
的介紹到這一節為止就暫時告一段落了。在以后的部分我會開始給大家介紹
JFace
。當然了,這并不意味著以后再也沒有
swt
的內容介紹給大家了,只是我覺得到現在為止,大家應該已經可以寫一些簡單的
swt
程序了,我如果再多介紹,就類似于對
API
文檔的翻譯了。當然如果以后有充足的時間的話,我也希望能夠向大家多介紹一些相關的內容。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=380786