一个实现了ViewPart和EditroPart的简单RCP例子

 最近作了个rcp程序的例子,结合这个例子来了解一下RCP的一些原理,怎样开发rcp程序,以及在初学RCP时会遇到哪些问题。希望对大家有所帮助  
不当之处,请指正。  
 
示例开发时环境:  
 
               ------eclipse3.2  
               ------jdk1.5.0_08  
 
首先说一下我理解的RCP。一个rcp就是一个应用程序,只是这个应用程序不像大多数我们常用的应用程序。现在经常用的应用程序在发布后想再扩展一些功能,就需要重新在原有代码基础上进行修改。而rcp程序有一个优点,它可以实现插件是扩展。即可在现有程序的基础上增加一个插件,这个插件实现了我们要扩展的功能。  
 
其实,整个eclipse体系中,核心的东西是一个很小的内核。其余的都是许许多多的插件由这个很小的内核组织起来,形成我们看到的eclipse的一个完整的开发环境。举个例子,我们整个实验室可以认为是一个eclipse开发环境。我们每个人就是一个插件,负责不同的方向,实现不同的功能;师兄可以认为是那个内核,负责把我们组织起来,把每个人的功能发挥出来。现在RCP也是同样的道理,可以认为一个RCP就是一个简化了的eclipse平台,它只包含5个插件:runtime是核心类,osgi是定义的一个标准,用来规范不同的插件,让他们可以相互协作。剩下的三个插件Workbench、SWT、JFace是用来显示给用户界面的。因此我们主要的精力应该放在对这三个插件的开发上。  
 
前面介绍了一下eclipse和rcp的体系结构,在实际程序中遇到最多的还是一下几个主要概念,Workbench、Workbenchwindow、WorkbenchPage、Perspective、WorkbenchPart。其中WorkbenchPart又包含ViewPart和EditorPart;可以看出这几个概念是针对用户界面的。    理解了这几个概念以及它们之间的关系。基本上rcp就差不多了解了。需要注意的是这几个概念及其关系有个整体的把握即可,在初学阶段不应该花大量时间去研究它们为什么会存在这种关系,为什么是这样,而不是那样等等很抽象的一些东西上面。  
 
下面就结合上面的几个主要概念,做一个比较简单的例子,几个主要步骤如下:  
 
1、新建一个工程  
 
2、创建一个ViewPart  
 
3、为ViewPart创建菜单  
 
4、添加菜单Action  
 
5、创建一个EditorPart  
 
6、创建调用EditorPart的Action  
 
下面是具体步骤:  
 
         第一步:建立一个RCP工程。  
         file—>  new—>project,选择plug-in  project—>next    给工程起个名字MyRcp,其他不变—>next  这步中注意:在对话框最下面              Would  you  like  to  create  a  rich  client  application?    一定要选择yes    —>next    这步选择一个模版:RCP  applicatin  with  an  intro—>next  直至finish  
 
       第二步:创建一个ViewPart  
 
打开plugin.xml文件,会出现一个编辑器,找到extension选项卡    add—>输入org.eclipse.ui.views      确定即可在extension选项页中会发现org.eclipse.ui.views,右键单击,选择new---views  
 
           设置  id=myrcp.view  记住此id,因为后面打开ViewPart时会用到。  
 
                       Name=myrcp.view。  
 
                       Class=myrcp.intro.CustomerViewPart此类继承了ViewPart接口。  
 
             在myrcp.intro包中创建这个类,注意创建时要实现ViewPart接口。具体如何实现如下:  
 
       在myrcp.intro包上右键—>new—>class    在对话框中给要建的类起名为:CustomerViewPart,    
 
       Superclass  对应的文本框中右侧Browse  在其中输入ViewPart确定即可。  
 
现在只是扩展了一个ViewPart,并且实现了一个ViewPart对应的类,具体ViewPart上面有什么我们还没有定义。下一步在这个ViewPart上面添加一个talbeviewer,并且在tableviewer中要显示几行数据。说明一下,这几行数据是通过固定赋值的方式实例化三个Customer对象,因此在画tableviewer之前要做一下准备工作。  
 
                 (1)、创建Customer对象类--------Customer.java。  
 
                 (2)、建一个Customer工厂类------CustomerFactory.java      实际就是实例化几个Customer对象。  
 
                 (3)、创建tableviewer的ContentProvider类-------CustomerContentProvider.java。  
 
                 (4)、创建tableviewer的LabelProvider类--------CustomerLabelProvider.java。  
 
                 tableviewer要想显示数据必须实现ContentProvider和LabelParvider类。  
 
这四个.java文件放在附件的customer和provider文件夹中。  
 
在CustomerViewPart的createPartControl()方法中加入创建tableviewer的代码。代码如下:  
 
---------------------------------------------------------------------  
 
                 viewer  =  new  TableViewer(parent,SWT.MULTI  ¦SWT.FULL_SELECTION);  
 
                 TableColumn  nameColumn  =  new  TableColumn(viewer.getTable(),SWT.NONE);  
 
                 nameColumn.setWidth(50);  
 
                 nameColumn.setText("姓名");  
 
                 TableColumn  sexColumn  =  new  TableColumn(viewer.getTable(),SWT.NONE);  
 
                 sexColumn.setWidth(50);  
 
                 sexColumn.setText("性别");  
 
                 TableColumn  bornDateColumn  =  new  TableColumn(viewer.getTable(),SWT.NONE);  
 
                 bornDateColumn.setWidth(150);  
 
                 bornDateColumn.setText("出生日期");  
 
                 TableColumn  postColumn  =  new  TableColumn(viewer.getTable(),SWT.NONE);  
 
                 postColumn.setWidth(70);  
 
                 postColumn.setText("职业");  
 
                 viewer.getTable().setHeaderVisible(true);  
 
                 viewer.getTable().setLinesVisible(true);  
 
                 viewer.setContentProvider(new  CustomerContentProvider());  
 
                 viewer.setLabelProvider(new  CustomerLabelProvider());  
 
                 CustomerFactory.getCustomer().clear();  
 
                 viewer.setInput(CustomerFactory.getCustomer());  
 
---------------------------------------------------------------------  
 
代码加入后一定会出现错误,  
 
错误1:viewer没有定义,在CustomerViewPart定义一个TalbeViewer类型的属性viewer。  
 
错误2:有几个包没导进来,方法ctrl+shift+o。  
 
要想显示出ViewPart还需要在perspective.java的createInitialLayout()函数中加入如下代码  
 
-------------------------------------------------------------------------------------  
 
                 String  editorArea=layout.getEditorArea();  
 
                 layout.addView("myrcp.view",IPageLayout.LEFT,  0.5f,  editorArea);  
 
---------------------------------------------------------------------  
 
第一个参数代表要显示ViewPart的id上文提到过  
 
参数二:位置  
 
参数三:所占比例  
 
参数四:所在区域  
第三步:为ViewPart创建菜单  
 
   为ViewPart加一个menu以及toolbar。当关闭ViewPart后仍可以通过它们来重新打开。  
 
     这儿注册的menu及toolbar是属于窗口的。因此可以直接在extension中对其扩展。  
 
(这步操作比较繁琐,容易出问题)  
 
方法:extension页中      add—  >org.eclipse.ui.actionSets  
 
           (1)、右键org.eclipse.ui.actionSets      new一个actionSet。Id=myrcp.OpenView  
 
               Name=myrcp.OpenView。注意visible一定要选择true  
 
           (2)、在这个actionSet上new一个menu。Id=  OpenViewMenu  
 
                 Label=Open  
 
           (3)、在这个menu上new一个separator。Name=ViewGroup。  
 
           (4)、回到第二步的actionSet,在它上面再new一个action。会看到有很多个属性。  
 
         设置如下:  
 
     Id=myrcp.openaction  
 
     Label=&Open  
 
     Menubarpath=OpenViewMenu/ViewGroup即上面定义的menu的id和separator的name。  
 
     toolbarPath=  ViewGroup  
 
     icons=选择一个.gif的图片。补充一下,这之前应该把包含几个.gif格式的文件放到工程所在的目录下,这儿有个icons文件夹,在eclipse中刷新工程按F5  
 
     class=myrcp.intro.sampleAction  
 
     sampleAction是一个实现了接口IWorkbenchWindowActionDelegate的action类。  
 
     它用来触发点击菜单后打开ViewPart的动作                                                                                    
 
 (5)、在myrcp.intro包中创建sampleAction类。注意实现接口    IWorkbenchWindowActionDelegate                                  
 
           (6)、在sampleAction中添加如下代码  
 
                   定义一个变量:private  IWorkbenchWindow  window  
 
                     重写run函数  
 
---------------------------------------------------------------------  
 
   
 
         public  void  run(IAction  action){  
 
                 try{  
 
                           window.getActivePage().showView(  "myrcp.view  ");  
 
                 }catch  (PartInitException  e){  
 
                           e.printStackTrace();  
 
                 }  
 
         }  
 
   
 
   重写init函数  
 
---------------------------------------------------------------------  
 
         public  void  init(IWorkbenchWindow  window){  
 
                 this.window  =  window;  
 
}  
 
---------------------------------------------------------------------  
 
第四步:创建一个EditorPart  
 
扩展一个EditorPart,回到extension页面。add----org.eclipse.ui.editors  
 
(1)、New一个editor。  
 
Id=myrcp.editor        name=myrcp.editor  
 
选择一个icons(必须)  
 
Class=myrcp.intro.CustomerEditor。  
 
创建这个类,它实现了EditorPart。(这儿不用直接创建,在包myrcp.intro中,导入EditorPart的java文件,在文件夹editor下)。  
 
(2)、EditorPart会对应一个EditorInput,目的是实现对editor的输入数据。  
 
           因此再导入一个EditorInput。(在文件夹editor下)  
 
第五步:为EditorPart创建一个Action  
 
EditorPart已经扩展了,但没有地方可以调用它让他显示出来。可以为它加个toolbar或者memubar来打开。  
 
有两种方法,第一种:如同打开ViewPart,定义一实现接口IWorkbenchWindowActionDelegate的action,然后在window窗口中扩展menu及toolbar。通过它们打开editor。但这样不容易对ViewPart中表格的数据进行控制。如取得一条记录的相关信息显示在editor中。或者有些属性内容太长在表格中无法全部显示出来,编辑时就会用到editor。  
 
另一种方法就是直接给ViewPart添加一个toolbar。让这个toolbar来控制打开EditorPart。  
 
这儿采用第二种方法。  
 
     (1)、在CustomerViewPart中定义一个函数contributeToActionBars(),  在此函数中,new一个Action,将此Action注册到ViewPart的toolbar中。  
 
函数代码如下:  
 
------------------------------------------------------------------  
 
   private  void  contributeToActionBars(){  
 
             ClickAction  =new  Action(){  
 
                       public  void  run(){  
 
         Object  customer  =((StructuredSelection)viewer.getSelection()).getFirstElement();  
 
         CustomerEditorInput  in  =  new  CustomerEditorInput((Customer)customer);  
 
         try  {  
 
   getSite().getWorkbenchWindow().getActivePage().openEditor(in,CustomerEditor.ID);  
 
                   }  catch  (PartInitException  e)  {  
 
                 MessageDialog.openError(getSite().getWorkbenchWindow().getShell(),    "Error  ",    "Error  opening  view:  "  +  e.getMessage());  
 
                               }  
 
                       }  
 
             };  
 
             ClickAction.setText(  "编辑  ");  
 
             IActionBars  bar=getViewSite().getActionBars();  
 
bar.getToolBarManager().add(new  ActionContributionItem(ClickAction));  
 
}  
   
 
这儿也会出现错误,ClickAction没有定义。在ViewPart中定义一个Action类型的ClickAction。  
 
最后在createPartControl()中调用contributeToActionBars()即可  
 
文章中用到的.java文件如有需要,请于hit_aiping@hotmail.com  联系  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值