SWT/JFace开发入门指南(十一)〈转帖〉

SWT/JFace开发入门指南(十一)〈转帖〉

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 设置图标的。然后再运行一下就会发现菜单和工具栏都有图标了。

你可能感兴趣的:(SWT/JFace开发入门指南(十一)〈转帖〉)