JFace中的工具條和菜單
前一節(jié)中我們簡(jiǎn)單介紹了一下
Action
。其實(shí)所謂的
Action
就是一個(gè)最常用的事件,舉個(gè)例子來說,對(duì)于一個(gè)按鈕來說它可以有多個(gè)事件,比如按鍵,焦點(diǎn),鼠標(biāo),等等等等吧,但是實(shí)際上在使用程序的時(shí)候,我們最關(guān)心的,就是按下去這個(gè)按鈕會(huì)發(fā)生什么,這個(gè)其實(shí)就是所謂的
Action
。如果大家以前做過
swing/awt
變成的話,應(yīng)該對(duì)
Action
不會(huì)陌生。
在
JFace
里面,一個(gè)
Action
可以對(duì)應(yīng)多個(gè)
GUI
對(duì)象,這些對(duì)象就是所謂的
Contribution Item
。比如我們?cè)谝话愠绦蚶锩婧艹R姷摹拔募辈藛危旅娑紩?huì)有“新建”,“保存”等等。同時(shí)我們可以在工具條上放置相應(yīng)的按鈕,那么這些都是有相同的功能,在
JFace
里面我們可以只寫一個(gè)
Action
,然后把它映射到不同的
ContributionItem
去,而不必為每個(gè)部件都寫一串處理事件。
我們下面還是通過一個(gè)簡(jiǎn)單的例子來說明,在
JFace
中怎么使用菜單和工具條這兩種最基本也是最有用的
Contribution Item
。
我們這個(gè)程序?qū)懙煤苌担褪且粋€(gè)光禿禿的窗口上做了一個(gè)菜單和工具條按鈕,功能也只有一個(gè),就是每次點(diǎn)一下,就彈出一個(gè)輸入框來問你名字是什么,然后顯示一個(gè)
Hello, xxx
之類的。
首先我們還是來寫一個(gè)
Action
類:
?1?
?2?public?class?SayHiAction?extends?Action?{
?3?????private?Shell?shell;
?4?
?5?????public?SayHiAction(Shell?shell)?{
?6?????????super();
?7?????????this.shell?=?shell;
?8?????????this.setText("Say&Hi@Ctrl+H");
?9?????}
10?
11?????@Override
12?????public?void?run()?{
13?????????InputDialog?input?=?new?InputDialog(shell,?"Input?your?name",
14?????????????????"Please?input?your?name?here:",?null,?null);
15?????????if?(input.open()?==?Window.OK)?{
16?????????????MessageDialog.openInformation(shell,?"Hello",?"Hello,?"
17?????????????????????+?input.getValue()?+?"!");
18?????????}
19?
20?????}
21?
22?}
23?
代碼段
17
這只是一個(gè)很簡(jiǎn)單的
Action
類,沒有太多可說的。
然后我們創(chuàng)建一個(gè)
ApplicationWindow
類:
?1?
?2?public?class?Hiyou?extends?ApplicationWindow?{
?3?
?4?????private?SayHiAction?hiaction;
?5?????public?Hiyou(Shell?parentShell)?{
?6?????????super(parentShell);
?7?????????hiaction=new?SayHiAction(getShell());
?8?????????addMenuBar();
?9?????????addToolBar(SWT.FLAT?|?SWT.WRAP);
10?????}
11?
12?????@Override
13?????protected?ToolBarManager?createToolBarManager(int?style)?{
14?????????ToolBarManager?toolbar=new?ToolBarManager();
15?????????toolbar.add(hiaction);
16?????????return?toolbar;
17?????}
18?
19?????@Override
20?????protected?MenuManager?createMenuManager()?{
21?????????MenuManager?menubar=new?MenuManager();
22?????????MenuManager?fileMenu=new?MenuManager("&File");
23?????????fileMenu.add(hiaction);
24?????????menubar.add(fileMenu);
25?????????return?menubar;
26?????}
27?
28?????/**
29??????*?@param?args
30??????*/
31?????public?static?void?main(String[]?args)?{
32?????????Hiyou?window=new?Hiyou(null);
33?????????window.setBlockOnOpen(true);
34?????????window.open();
35?????????Display.getCurrent().dispose();
36?????}
37?
38?}
39?
?
代碼段
18
大家可能已經(jīng)注意到了,在這里面我們重載了
createMenuManager
和
createToolBarManager
兩個(gè)方法,它們的用途就和名字一樣,一個(gè)是用來創(chuàng)建菜單的,一個(gè)是用來創(chuàng)建工具條的。重載了這兩個(gè)方法以后,通過在構(gòu)造函數(shù)中調(diào)用
addMenuBar
和
addToolBar
讓工具條和菜單顯示出來。
這里值得一提的是
MenuManager
和
ToolBarManager
類,如果大家翻一下
API
文檔的話會(huì)發(fā)現(xiàn)它們都是所謂的
contribution manager
(實(shí)現(xiàn)了
IConntributionManager
接口),你可以通過這些
contribution manager
來實(shí)現(xiàn)對(duì)特定組件的管理(添加刪除等等)。
具體到菜單的創(chuàng)建,看了我們上面的代碼就很明白了,就直接調(diào)用相應(yīng)
MenuManager
的
add
方法把
action
添加上就可以了。
JFace
會(huì)自動(dòng)找到這個(gè)
Action
的
getText
方法設(shè)置菜單的文字。如果是有好幾層菜單,那么只要在重新
new
一個(gè)
MenuManager
添加到已有的
MenuManager
里面就可以了。就象前面代碼中的:
menubar.add(fileMenu);
至于工具條就更簡(jiǎn)單了,創(chuàng)建一個(gè)
ToolBarManager
然后直接
add
對(duì)應(yīng)的
Action
就可以了。
添加圖標(biāo)
如果菜單只是文字還沒有什么,如果你的工具條都是文字是不是會(huì)顯得干巴巴的?其實(shí)只要我們?yōu)?/span>
Action
設(shè)置
ImageDescriptor
就可以了,比如你可以自己畫一個(gè)圖標(biāo)保存到
Action
的包下面(我畫了一個(gè)
hi.gif
),然后把
Action
的構(gòu)造函數(shù)改寫成這樣:
public
?SayHiAction(Shell?shell)?{
????????
super
();
????????
this
.shell?
=
?shell;
????????
this
.setText(
"
Say&Hi@Ctrl+H
"
);
????????
this
.setImageDescriptor(ImageDescriptor.createFromFile(
this
.getClass(),
????????????????
"
hi.gif
"
));
????}
大家注意最后一句話,就是為
action
設(shè)置圖標(biāo)的。然后再運(yùn)行一下就會(huì)發(fā)現(xiàn)菜單和工具欄都有圖標(biāo)了。
在這里給一個(gè)社區(qū)做個(gè)廣告,大家可以登陸到在中國(guó)
eclipse
社區(qū)(
http://www.eclipseworld.org
),在那里你也可以找到很多的幫助和支持,當(dāng)然,你也可以在那里找到我。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=523860