The Spark of Thinking

          Focus on Eclipse Tools.

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            3 隨筆 :: 27 文章 :: 4 評論 :: 0 Trackbacks

          JFace中的工具條和菜單

          前一節中我們簡單介紹了一下 Action 。其實所謂的 Action 就是一個最常用的事件,舉個例子來說,對于一個按鈕來說它可以有多個事件,比如按鍵,焦點,鼠標,等等等等吧,但是實際上在使用程序的時候,我們最關心的,就是按下去這個按鈕會發生什么,這個其實就是所謂的 Action 。如果大家以前做過 swing/awt 變成的話,應該對 Action 不會陌生。

          JFace 里面,一個 Action 可以對應多個 GUI 對象,這些對象就是所謂的 Contribution Item 。比如我們在一般程序里面很常見的“文件”菜單,下面都會有“新建”,“保存”等等。同時我們可以在工具條上放置相應的按鈕,那么這些都是有相同的功能,在 JFace 里面我們可以只寫一個 Action ,然后把它映射到不同的 ContributionItem 去,而不必為每個部件都寫一串處理事件。

          我們下面還是通過一個簡單的例子來說明,在 JFace 中怎么使用菜單和工具條這兩種最基本也是最有用的 Contribution Item

          我們這個程序寫得很傻,就是一個光禿禿的窗口上做了一個菜單和工具條按鈕,功能也只有一個,就是每次點一下,就彈出一個輸入框來問你名字是什么,然后顯示一個 Hello, xxx 之類的。

          首先我們還是來寫一個 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

          這只是一個很簡單的 Action 類,沒有太多可說的。

          然后我們創建一個 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

          大家可能已經注意到了,在這里面我們重載了 createMenuManager createToolBarManager 兩個方法,它們的用途就和名字一樣,一個是用來創建菜單的,一個是用來創建工具條的。重載了這兩個方法以后,通過在構造函數中調用 addMenuBar addToolBar 讓工具條和菜單顯示出來。

          這里值得一提的是 MenuManager ToolBarManager 類,如果大家翻一下 API 文檔的話會發現它們都是所謂的 contribution manager (實現了 IConntributionManager 接口),你可以通過這些 contribution manager 來實現對特定組件的管理(添加刪除等等)。

          具體到菜單的創建,看了我們上面的代碼就很明白了,就直接調用相應 MenuManager add 方法把 action 添加上就可以了。 JFace 會自動找到這個 Action getText 方法設置菜單的文字。如果是有好幾層菜單,那么只要在重新 new 一個 MenuManager 添加到已有的 MenuManager 里面就可以了。就象前面代碼中的:

          menubar.add(fileMenu);



          至于工具條就更簡單了,創建一個 ToolBarManager 然后直接 add 對應的 Action 就可以了。

          添加圖標

          如果菜單只是文字還沒有什么,如果你的工具條都是文字是不是會顯得干巴巴的?其實只要我們為 Action 設置 ImageDescriptor 就可以了,比如你可以自己畫一個圖標保存到 Action 的包下面(我畫了一個 hi.gif ),然后把 Action 的構造函數改寫成這樣:

          public ?SayHiAction(Shell?shell)?{
          ????????
          super ();
          ????????
          this .shell? = ?shell;
          ????????
          this .setText( " Say&Hi@Ctrl+H " );
          ????????
          this .setImageDescriptor(ImageDescriptor.createFromFile( this .getClass(),
          ????????????????
          " hi.gif " ));
          ????}



          大家注意最后一句話,就是為 action 設置圖標的。然后再運行一下就會發現菜單和工具欄都有圖標了。

          在這里給一個社區做個廣告,大家可以登陸到在中國 eclipse 社區( http://www.eclipseworld.org ),在那里你也可以找到很多的幫助和支持,當然,你也可以在那里找到我。



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=523860

          [點擊此處收藏本文]?? 幻發表于 2005年11月06日 13:12:00
          posted on 2006-07-20 18:16 The Spark of Thinking 閱讀(258) 評論(0)  編輯  收藏 所屬分類: SWT/JFace
          主站蜘蛛池模板: 江阴市| 焦作市| 鄂托克前旗| 滦南县| 汶川县| 灯塔市| 遂宁市| 水富县| 鞍山市| 漳州市| 津市市| 巩留县| 恭城| 任丘市| 江山市| 衡东县| 绥化市| 平乡县| 武邑县| 多伦县| 且末县| 桐梓县| 漯河市| 东台市| 涞水县| 连平县| 霸州市| 淮阳县| 台江县| 城口县| 偏关县| 济阳县| 绵竹市| 琼中| 靖宇县| 蚌埠市| 锦屏县| 丹巴县| 荣昌县| 高要市| 黄陵县|