使用Eclipse RCP创建视图并实现视图间消息传递

时间:2021-04-26 17:01:33

最近在客户端软件开发过程中,使用到了Eclipse RCP的若干技术,有种相见很晚的感觉。尽管自己在日常开发中也使用了SWT中的若干技术,在运用了Theme之后看起来也让人眼前一亮,但是比起RCP就相当于闭门造车了,例如下面两幅图片,就是SWT技术和RCP技术开发出的不同界面,后者看起来是不是很炫呢,用流行的话来讲,就是使用户的体验更rich了,呵呵。
SWT界面:
使用Eclipse RCP创建视图并实现视图间消息传递
Eclipse RCP界面:
使用Eclipse RCP创建视图并实现视图间消息传递


好了,既然Eclipse RCP开发出的界面如此漂亮,那我们就可以借助Eclipse RCP平台中各类UI组件来改善应用程序上的UI缺陷,通过RCP平台上的各类丰富的GUI视图,来打造赏心悦目的应用程序。但是在RCP开发的过程中,UI视图之间是相互依赖的,需要进行交互,目前国内教程对这一步骤往往语焉不详,下文就以实例的形式详细介绍Eclipse RCP View视图之间的交互机制,并总结了开发过程中的一些注意事项,避免大家绕了弯路,呵呵。

(一)下载最新的Eclipse RCP开发环境
开发RCP的首要前提是下载RCP开发环境,从http://www.eclipse.org/上可以下载,下载之后是个zip格式文件,解压到任何目录下都可以直接运行,前提是装好jdk。在Eclipse的官方网站上,针对不同的开发环境,已经为我们打好了不同的package,只要下载专门用来开发RCP的package即可。当然如果你已经安装了Eclipse普通开发环境,想增加RCP相关的开发功能,需要通过Eclipse的update功能来添加就可以了,不过后者采用在线安装的方式,容易引起packge插件下载不全,导致开发时出现莫明其妙的错误,因此推荐第一种方案。

(二)新建并运行Eclipse RCP项目
Eclipse安装并启动完毕之后,我们可以以插件的形式新增一个RCP模块,在该模块的基础上再添加不同的视图,这样就为下一步打下了良好的基础:
在Eclipse的Package Explorer中单击右键,选择菜单第一项“new”,在弹出的子菜单中选择“other”,在对话框中如下图选择:
使用Eclipse RCP创建视图并实现视图间消息传递
在弹出对话框的“project name”栏中填入自己的项目名称,例如“hellorcp“,其余选项保持默认状态,点击下一步,在Plugin content对话框中“Rich Client Application”中,选择"YES",如下图所示:
使用Eclipse RCP创建视图并实现视图间消息传递
选择YES表示除了新建一个插件之外,还愿意将其转换成一个RCP应用,以便以后脱离Eclipse开发环境而独立部署,而插件是不能独立运行的,必须依附Eclipse而运行。
点击下一步,选择一个模版,如下图所示:
使用Eclipse RCP创建视图并实现视图间消息传递
点击Finish,在出现的最后对话框中选择“static content”,点击完成,这样就完成了向导方式下的Eclipse RCP项目hellorcp的创建,下面是该RCP项目在package explorer中的视图:
使用Eclipse RCP创建视图并实现视图间消息传递
至此,我们已经创建了一个hellorcp的项目,在右边的editor窗口中,自动出现了hellorcp的启动视图,点击"Testing"中的“launch”链接,可以启动该rcp项目:
使用Eclipse RCP创建视图并实现视图间消息传递
大功告成,我们得到了一个可以运行的Eclipse RCP项目,Eclipse RCP的项目创建过程是不是非常简单呢?现在的界面就像一个白板,我们已经迫不及待地想在上面丰富我们的视图了,接下来我们的任务是创建不同的视图,并添加代码让它们动起来,在做这些之前,介绍一下Eclipse RCP上面的一些概念:
(三)Eclipse RCP 术语介绍:

  • Application
    Application的作用就是应用程序或产品(product)的入口,它和Java系统中,类定义的main()方法作用一样. 当Runtime启动的时候,应用程序开始运行,应用程序退出的时候,Eclipse关闭。
    在我们的hellorcp中的src文件夹中,Eclipse为我们自动生成了Application类,如下面的代码片段:
     1 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递public  Object start(IApplicationContext context)  {
     2使用Eclipse RCP创建视图并实现视图间消息传递        Display display = PlatformUI.createDisplay();
     3使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递        try {
     4使用Eclipse RCP创建视图并实现视图间消息传递            int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());
     5使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递            if (returnCode == PlatformUI.RETURN_RESTART) {
     6使用Eclipse RCP创建视图并实现视图间消息传递                return IApplication.EXIT_RESTART;
     7使用Eclipse RCP创建视图并实现视图间消息传递            }

     8使用Eclipse RCP创建视图并实现视图间消息传递            return IApplication.EXIT_OK;
     9使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递        }
     finally {
    10使用Eclipse RCP创建视图并实现视图间消息传递            display.dispose();
    11使用Eclipse RCP创建视图并实现视图间消息传递        }

    12使用Eclipse RCP创建视图并实现视图间消息传递    }

    在start方法中,首先创建了Display对象,然后使用平台的UI线程PlatformUI启动了程序运行,而启动过程是通过传递display对象以及新建的ApplicationWorkbenchAdvisor对象来进行的,下面就介绍一下ApplicationWorkbenchAdvisor对象
  • ApplicationWorkbenchAdvisor
    在应用程序中,每一个窗口都有一个 WorkbenchWindowAdvisor ,它的作用是也是告诉窗口如何渲染.在 Window advisors根据窗口的生命周期定义了多个切入点函数,如preWindowOpen()窗口打开前 ,postWindowCreate()创建窗口结后等,可以在不同的方法创建窗口的内容,了解窗口的生命周期是很有必要的,可以让你规划后,在何时才能创建相应的对象,有效的避免窗口中的组件还没有被创建,就已经在使用了.
     1 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递public   class  ApplicationWorkbenchAdvisor extends WorkbenchAdvisor  {
     2使用Eclipse RCP创建视图并实现视图间消息传递
     3使用Eclipse RCP创建视图并实现视图间消息传递    private static final String PERSPECTIVE_ID = "hellorcp.perspective";
     4使用Eclipse RCP创建视图并实现视图间消息传递
     5使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
     6使用Eclipse RCP创建视图并实现视图间消息传递        return new ApplicationWorkbenchWindowAdvisor(configurer);
     7使用Eclipse RCP创建视图并实现视图间消息传递    }

     8使用Eclipse RCP创建视图并实现视图间消息传递    
     9使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void initialize(IWorkbenchConfigurer configurer) {
    10使用Eclipse RCP创建视图并实现视图间消息传递        super.initialize(configurer);
    11使用Eclipse RCP创建视图并实现视图间消息传递        configurer.setSaveAndRestore(true);
    12使用Eclipse RCP创建视图并实现视图间消息传递    }

    13使用Eclipse RCP创建视图并实现视图间消息传递
    14使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public String getInitialWindowPerspectiveId() {
    15使用Eclipse RCP创建视图并实现视图间消息传递        return PERSPECTIVE_ID;
    16使用Eclipse RCP创建视图并实现视图间消息传递    }

    17使用Eclipse RCP创建视图并实现视图间消息传递}

    在ApplicationWorkbenchAdvisor中,向导为我们创建了ApplicationWorkbenchWindowAdvisor对象,别的什么也没做。Eclipse遵从经典的MVC模式来设计,其中Advisor类就相当于Model,相当于视图的内容提供者,这样就把view和model解耦了。像它的名字一样, WorkbenchAdvisor 告诉工作台怎样显示,显示什么等信息。在RCP应用程序中,很多地方用这种模板模式来构建UI组件。WorkbenchAdvisor做了两件事:
    初始化默认视图和创建Application的window advisor
  • ApplicationWorkbenchWindowAdvisor
    在应用程序中,每一个窗口都有一个 WorkbenchWindowAdvisor ,它的作用是也是告诉窗口如何渲染.在 Window advisors根据窗口的生命周期定义了多个切入点函数,如preWindowOpen()窗口打开前 ,postWindowCreate()创建窗口后等,可以在不同的方法创建窗口的内容,了解窗口的生命周期是很有必要的,可以让你规划后,在何时才能创建相应的对象,有效的避免窗口中的组件还没有被创建,就已经在使用了
     1 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递public  ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)  {
     2使用Eclipse RCP创建视图并实现视图间消息传递        super(configurer);
     3使用Eclipse RCP创建视图并实现视图间消息传递    }

     4 使用Eclipse RCP创建视图并实现视图间消息传递
     5 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递     public  ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer)  {
     6使用Eclipse RCP创建视图并实现视图间消息传递        return new ApplicationActionBarAdvisor(configurer);
     7使用Eclipse RCP创建视图并实现视图间消息传递    }

     8 使用Eclipse RCP创建视图并实现视图间消息传递    
     9 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递     public   void  preWindowOpen()  {
    10使用Eclipse RCP创建视图并实现视图间消息传递        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
    11使用Eclipse RCP创建视图并实现视图间消息传递        configurer.setInitialSize(new Point(700550));
    12使用Eclipse RCP创建视图并实现视图间消息传递        configurer.setShowCoolBar(false);
    13使用Eclipse RCP创建视图并实现视图间消息传递        configurer.setShowStatusLine(false);
    14使用Eclipse RCP创建视图并实现视图间消息传递        configurer.setTitle("RCP Product");
    15使用Eclipse RCP创建视图并实现视图间消息传递    }
  • ApplicationActionBarAdvisor

    ActionBarAdvisors 创建了窗口需要的actions(动作),所谓动作指的就是菜单项和工具栏项。在Eclipse的开发模式中,将用户点击后系统所作的动作都可以定义为Action,这也实现了MVC的设计模式。如果不这样做,而是在UI的控件上直接添加Action Listener的话,界面代码和动作代码就会混杂在一起,以后维护起来就比较麻烦。因此如果要新增任何的用户交互动作,都需要在该类中的MakeActions方法中实例化。
    1 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递protected   void  makeActions(IWorkbenchWindow window)  {
    2使用Eclipse RCP创建视图并实现视图间消息传递        introAction = ActionFactory.INTRO.create(window);
    3使用Eclipse RCP创建视图并实现视图间消息传递        register(introAction);
    4使用Eclipse RCP创建视图并实现视图间消息传递    }

  • Perspective
    顾名思义,Perspective主要定义了RCP窗口的布局,透视图类必须实现IPerspectiveFactory 接口,并在createInitial Layout(IPageLayout)方法添加实际的布局代码。在这个例子中,我们就使用默认布局。在后期创建视图的过程中,我们还要用到这个类。
  • 以下是Eclipse RCP创建时上述几个对象的时序图:
    使用Eclipse RCP创建视图并实现视图间消息传递

(四)创建视图
如上所示,我们已经了解了Eclipse RCP上的一些概念,每个类各司其职,共同组成了美妙的窗口和布局,这就是Eclipse的魅力,在下面我们就着手创建视图,在接下来的章节中,上面介绍的概念都要用到。
视图(View 和ViewPart)
视图,视图是为了方便用户编辑提供一些辅助功能或编辑一些属性。比如最常见的Outline视图往往用来提供当前编辑的文档的结构,而在Eclipse开发环境菜单项"window"中,选择"show view"项,还可以看到更多的视图。如果用户使用Eclipse的PDE来开发Java程序,往往一个java文件打开,都伴随着不同视图的出现,从而为开发人员提供了不同的观察代码及其运行方式的窗口。
使用Eclipse RCP创建视图并实现视图间消息传递
下面我们就使用向导创建第一个视图:navigationView视图。
点击hellorcp项目中的plugin.xml文件,在editor中打开整个hellorcp项目的视图。这里要补充一下,plugin.xml是整个Eclipse RCP项目的配置文件,主要描述了插件之间的依赖关系,以及插件内部扩展的模块等等项目元数据信息。Eclipse提供了plugin.xml的可视化编辑方式,减轻了直接编辑xml的复杂度。
使用Eclipse RCP创建视图并实现视图间消息传递
一般来说,创建视图可以通过使用Eclipse的Extension机制来完成,通过继承Eclipse的Views组件,可以创建一个简单的视图。
使用Eclipse RCP创建视图并实现视图间消息传递
点击“finish”,就可以在extensions视图里看到新增的org.eclipse.ui.views扩展点,右键单击该扩展点,选择新建view,如下图:
使用Eclipse RCP创建视图并实现视图间消息传递
在视图右边的新建view对话框中,填入view的名称:navigationView,如下图所示:
使用Eclipse RCP创建视图并实现视图间消息传递
目前我们已经在plugin.xml中定义了navigationview扩展点,现在为该navigationview添加实现类,在上图的class*文本上点击"ctl+enter",可以打开新建navigationview class的界面:
使用Eclipse RCP创建视图并实现视图间消息传递
点击保存,我们现在就得到了一个navigation view,而eclipse自动在plugin.xml文件中自动添加了有关配置片段:

1 使用Eclipse RCP创建视图并实现视图间消息传递< extension
2 使用Eclipse RCP创建视图并实现视图间消息传递          point ="org.eclipse.ui.views" >
3 使用Eclipse RCP创建视图并实现视图间消息传递       < view
4 使用Eclipse RCP创建视图并实现视图间消息传递             class ="hellorcp.NavigationViewPart"
5 使用Eclipse RCP创建视图并实现视图间消息传递            id ="hellorcp.navigationview"
6 使用Eclipse RCP创建视图并实现视图间消息传递            name ="navigationview" >
7 使用Eclipse RCP创建视图并实现视图间消息传递       </ view >
8 使用Eclipse RCP创建视图并实现视图间消息传递    </ extension >

通过以上步骤,我们得到了一个视图类,现在我们就可以回到eclipse开发环境中,点击package explorer中的NavigationViewPart文件,
使用Eclipse RCP创建视图并实现视图间消息传递
注意NavigationViewPart类中的createPartControl方法,视图中的表格、按钮之类的控件部分代码都是在该方法中创建的,现在我们在该方法中创建一个List,用来浏览我们提供的对象信息。注意Eclipse RCP是建立在jface基础上的,后者在swt的基础上对一些常用控件,例如表格、列表,树等做了封装,采用Viewer来提供视图,content provider和input model来提供模型,label provider来提供标签。因此要想创建列表并显示列表内容,必须同时创建上述几个对象,同时,为了填充数据模型,我们同时也创建了示例性质的Person对象以及相关辅助代码。如果在正式的环境中,这些model可以从数据库获得,在这里我们仅做示范性使用。以下依次是创建代码:
(1)模型:Person.class 和PersonModel.class
   
Person.class
    

使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp;
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递
public   class  Person  {
使用Eclipse RCP创建视图并实现视图间消息传递    
private String name;
使用Eclipse RCP创建视图并实现视图间消息传递    
private String sex;
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public String getName() {
使用Eclipse RCP创建视图并实现视图间消息传递        
return name;
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public void setName(String name) {
使用Eclipse RCP创建视图并实现视图间消息传递        
this.name = name;
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public String getSex() {
使用Eclipse RCP创建视图并实现视图间消息传递        
return sex;
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public void setSex(String sex) {
使用Eclipse RCP创建视图并实现视图间消息传递        
this.sex = sex;
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递}

使用Eclipse RCP创建视图并实现视图间消息传递

PersonModel.class

使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp;
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递
import  java.util.ArrayList;
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递
public   class  PersonModel  {
使用Eclipse RCP创建视图并实现视图间消息传递    
private ArrayList<Person> list = new ArrayList<Person>();
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public PersonModel() {
使用Eclipse RCP创建视图并实现视图间消息传递        
// 硬编码,初始化数据示例
使用Eclipse RCP创建视图并实现视图间消息传递
        Person p1 = new Person();
使用Eclipse RCP创建视图并实现视图间消息传递        p1.setName(
"毛毛");
使用Eclipse RCP创建视图并实现视图间消息传递        p1.setSex(
"");
使用Eclipse RCP创建视图并实现视图间消息传递        list.add(p1);
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递        Person p2 
= new Person();
使用Eclipse RCP创建视图并实现视图间消息传递        p2.setName(
"皮皮");
使用Eclipse RCP创建视图并实现视图间消息传递        p2.setSex(
"");
使用Eclipse RCP创建视图并实现视图间消息传递        list.add(p2);
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public ArrayList<Person> elements() {
使用Eclipse RCP创建视图并实现视图间消息传递        
return list;
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递}

使用Eclipse RCP创建视图并实现视图间消息传递

(2)LabelProvider

使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp;
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递
import  org.eclipse.jface.viewers.ILabelProvider;
使用Eclipse RCP创建视图并实现视图间消息传递
import  org.eclipse.jface.viewers.ILabelProviderListener;
使用Eclipse RCP创建视图并实现视图间消息传递
import  org.eclipse.jface.viewers.LabelProvider;
使用Eclipse RCP创建视图并实现视图间消息传递
import  org.eclipse.jface.viewers.LabelProviderChangedEvent;
使用Eclipse RCP创建视图并实现视图间消息传递
import  org.eclipse.swt.graphics.Image;
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递
public   class  NavigationViewLabelProvider  implements  ILabelProvider  {
使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public Image getImage(Object element) {
使用Eclipse RCP创建视图并实现视图间消息传递        
// TODO Auto-generated method stub
使用Eclipse RCP创建视图并实现视图间消息传递
        return null;
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public String getText(Object element) {
使用Eclipse RCP创建视图并实现视图间消息传递        
// TODO Auto-generated method stub
使用Eclipse RCP创建视图并实现视图间消息传递
        return ((Person)element).getName();
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public void addListener(ILabelProviderListener listener) {
使用Eclipse RCP创建视图并实现视图间消息传递        
// TODO Auto-generated method stub
使用Eclipse RCP创建视图并实现视图间消息传递

使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public void dispose() {
使用Eclipse RCP创建视图并实现视图间消息传递        
// TODO Auto-generated method stub
使用Eclipse RCP创建视图并实现视图间消息传递

使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public boolean isLabelProperty(Object element, String property) {
使用Eclipse RCP创建视图并实现视图间消息传递        
// TODO Auto-generated method stub
使用Eclipse RCP创建视图并实现视图间消息传递
        return false;
使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public void removeListener(ILabelProviderListener listener) {
使用Eclipse RCP创建视图并实现视图间消息传递        
// TODO Auto-generated method stub
使用Eclipse RCP创建视图并实现视图间消息传递

使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    
public void labelProviderChanged(LabelProviderChangedEvent event) {
使用Eclipse RCP创建视图并实现视图间消息传递        
// TODO Auto-generated method stub
使用Eclipse RCP创建视图并实现视图间消息传递

使用Eclipse RCP创建视图并实现视图间消息传递    }

使用Eclipse RCP创建视图并实现视图间消息传递
使用Eclipse RCP创建视图并实现视图间消息传递}

使用Eclipse RCP创建视图并实现视图间消息传递

(3)content provider

 1 使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp;
 2 使用Eclipse RCP创建视图并实现视图间消息传递
 3 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.ILabelProviderListener;
 4 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.IStructuredContentProvider;
 5 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.ListViewer;
 6 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.Viewer;
 7 使用Eclipse RCP创建视图并实现视图间消息传递
 8 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递 public   class  NavigationListViewContentProvider  implements  IStructuredContentProvider {
 9使用Eclipse RCP创建视图并实现视图间消息传递    PersonModel input;
10使用Eclipse RCP创建视图并实现视图间消息传递    ListViewer viewer;
11使用Eclipse RCP创建视图并实现视图间消息传递
12使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public Object[] getElements(Object inputElement) {
13使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated method stub
14使用Eclipse RCP创建视图并实现视图间消息传递        return input.elements().toArray();
15使用Eclipse RCP创建视图并实现视图间消息传递    }

16使用Eclipse RCP创建视图并实现视图间消息传递
17使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public String getText(Object element) {
18使用Eclipse RCP创建视图并实现视图间消息传递        return ((Person) element).getName();
19使用Eclipse RCP创建视图并实现视图间消息传递    }

20使用Eclipse RCP创建视图并实现视图间消息传递
21使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
22使用Eclipse RCP创建视图并实现视图间消息传递        viewer = (ListViewer) viewer;
23使用Eclipse RCP创建视图并实现视图间消息传递        input = (PersonModel) newInput;
24使用Eclipse RCP创建视图并实现视图间消息传递    
25使用Eclipse RCP创建视图并实现视图间消息传递    }

26使用Eclipse RCP创建视图并实现视图间消息传递
27使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void addListener(ILabelProviderListener listener) {
28使用Eclipse RCP创建视图并实现视图间消息传递        // TODO 自动生成方法存根
29使用Eclipse RCP创建视图并实现视图间消息传递
30使用Eclipse RCP创建视图并实现视图间消息传递    }

31使用Eclipse RCP创建视图并实现视图间消息传递
32使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void add(Person p) {
33使用Eclipse RCP创建视图并实现视图间消息传递        viewer.add(p);
34使用Eclipse RCP创建视图并实现视图间消息传递
35使用Eclipse RCP创建视图并实现视图间消息传递    }

36使用Eclipse RCP创建视图并实现视图间消息传递
37使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void remove(Person p) {
38使用Eclipse RCP创建视图并实现视图间消息传递        viewer.remove(p);
39使用Eclipse RCP创建视图并实现视图间消息传递
40使用Eclipse RCP创建视图并实现视图间消息传递    }

41使用Eclipse RCP创建视图并实现视图间消息传递
42使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void dispose() {
43使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated method stub
44使用Eclipse RCP创建视图并实现视图间消息传递        
45使用Eclipse RCP创建视图并实现视图间消息传递    }

46使用Eclipse RCP创建视图并实现视图间消息传递}

47 使用Eclipse RCP创建视图并实现视图间消息传递

(4)以下navigation view部分的代码

 1 使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp;
 2 使用Eclipse RCP创建视图并实现视图间消息传递
 3 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.action.IToolBarManager;
 4 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.IStructuredContentProvider;
 5 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.ListViewer;
 6 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.SWT;
 7 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.widgets.Composite;
 8 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.ui.part.ViewPart;
 9 使用Eclipse RCP创建视图并实现视图间消息传递 import  hellorcp.NavigationViewLabelProvider;
10 使用Eclipse RCP创建视图并实现视图间消息传递
11 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递 public   class  NavigationViewPart  extends  ViewPart  {
12使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public NavigationViewPart() {
13使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated constructor stub
14使用Eclipse RCP创建视图并实现视图间消息传递    }

15使用Eclipse RCP创建视图并实现视图间消息传递
16使用Eclipse RCP创建视图并实现视图间消息传递    @Override
17使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void createPartControl(Composite parent) {
18使用Eclipse RCP创建视图并实现视图间消息传递        final ListViewer listViewer = new ListViewer(parent, SWT.BORDER);
19使用Eclipse RCP创建视图并实现视图间消息传递        listViewer.setLabelProvider(new NavigationViewLabelProvider());
20使用Eclipse RCP创建视图并实现视图间消息传递        listViewer.setContentProvider(new NavigationListViewContentProvider());
           listViewer.setInput(new PersonModel());
21使用Eclipse RCP创建视图并实现视图间消息传递        initializeToolBar();
22使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated method stub
23使用Eclipse RCP创建视图并实现视图间消息传递
24使用Eclipse RCP创建视图并实现视图间消息传递    }

25使用Eclipse RCP创建视图并实现视图间消息传递
26使用Eclipse RCP创建视图并实现视图间消息传递    @Override
27使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void setFocus() {
28使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated method stub
29使用Eclipse RCP创建视图并实现视图间消息传递
30使用Eclipse RCP创建视图并实现视图间消息传递    }

31使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    private void initializeToolBar() {
32使用Eclipse RCP创建视图并实现视图间消息传递        IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
33使用Eclipse RCP创建视图并实现视图间消息传递    }

34使用Eclipse RCP创建视图并实现视图间消息传递
35使用Eclipse RCP创建视图并实现视图间消息传递}

36 使用Eclipse RCP创建视图并实现视图间消息传递

(5)最后,我们将创建的navigationview添加到perspective透视图中

 1 使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp;
 2 使用Eclipse RCP创建视图并实现视图间消息传递
 3 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.action.IToolBarManager;
 4 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.IStructuredContentProvider;
 5 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.ListViewer;
 6 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.SWT;
 7 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.widgets.Composite;
 8 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.ui.part.ViewPart;
 9 使用Eclipse RCP创建视图并实现视图间消息传递 import  hellorcp.NavigationViewLabelProvider;
10 使用Eclipse RCP创建视图并实现视图间消息传递
11 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递 public   class  NavigationViewPart  extends  ViewPart  {
12使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public NavigationViewPart() {
13使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated constructor stub
14使用Eclipse RCP创建视图并实现视图间消息传递    }

15使用Eclipse RCP创建视图并实现视图间消息传递
16使用Eclipse RCP创建视图并实现视图间消息传递    @Override
17使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void createPartControl(Composite parent) {
18使用Eclipse RCP创建视图并实现视图间消息传递        final ListViewer listViewer = new ListViewer(parent, SWT.BORDER);
19使用Eclipse RCP创建视图并实现视图间消息传递        listViewer.setLabelProvider(new NavigationViewLabelProvider());
20使用Eclipse RCP创建视图并实现视图间消息传递        listViewer.setContentProvider(new NavigationListViewContentProvider());
21使用Eclipse RCP创建视图并实现视图间消息传递        listViewer.setInput(new PersonModel());
22使用Eclipse RCP创建视图并实现视图间消息传递        initializeToolBar();
23使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated method stub
24使用Eclipse RCP创建视图并实现视图间消息传递
25使用Eclipse RCP创建视图并实现视图间消息传递    }

26使用Eclipse RCP创建视图并实现视图间消息传递
27使用Eclipse RCP创建视图并实现视图间消息传递    @Override
28使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void setFocus() {
29使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated method stub
30使用Eclipse RCP创建视图并实现视图间消息传递
31使用Eclipse RCP创建视图并实现视图间消息传递    }

32使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    private void initializeToolBar() {
33使用Eclipse RCP创建视图并实现视图间消息传递        IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
34使用Eclipse RCP创建视图并实现视图间消息传递    }

35使用Eclipse RCP创建视图并实现视图间消息传递
36使用Eclipse RCP创建视图并实现视图间消息传递}

37 使用Eclipse RCP创建视图并实现视图间消息传递

至此,我们已经创建了一个可以浏览人员信息的navigation view,运行一下我们创建的视图,可以得到如下效果,注意运行前需要将eclipse文件夹中以runtime...开头的文件夹删除,这是eclipse上次运行时创建的临时文件,如果不删除,就看不到修改之后的效果:
使用Eclipse RCP创建视图并实现视图间消息传递
OK,现在我们已经创建了一个视图,我们还需要创建另外一个details视图,用来显示人员的若干详细信息,按照上述创建视图的方法,我们同样可以创建该视图,以下就不赘述了,只贴出创建detail view视图的代码和perspective透视图部分的代码:
(一)Detail view

 1 使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp;
 2 使用Eclipse RCP创建视图并实现视图间消息传递
 3 使用Eclipse RCP创建视图并实现视图间消息传递 import  java.beans.PropertyChangeEvent;
 4 使用Eclipse RCP创建视图并实现视图间消息传递 import  java.util.AbstractList;
 5 使用Eclipse RCP创建视图并实现视图间消息传递 import  java.util.ArrayList;
 6 使用Eclipse RCP创建视图并实现视图间消息传递 import  java.util.Iterator;
 7 使用Eclipse RCP创建视图并实现视图间消息传递
 8 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
 9 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.action.IToolBarManager;
10 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.ISelection;
11 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.IStructuredSelection;
12 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.ISelectionChangedListener;
13 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.SelectionChangedEvent;
14 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.jface.viewers.TableViewer;
15 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.SWT;
16 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.events.SelectionAdapter;
17 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.widgets.Composite;
18 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.widgets.Group;
19 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.widgets.Label;
20 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.widgets.Table;
21 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.swt.widgets.Text;
22 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.ui.ISelectionListener;
23 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.ui.IWorkbenchPart;
24 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.ui.part.ViewPart;
25 使用Eclipse RCP创建视图并实现视图间消息传递
26 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递 public   class  DetailView  extends  ViewPart  {
27使用Eclipse RCP创建视图并实现视图间消息传递
28使用Eclipse RCP创建视图并实现视图间消息传递    private Table table;
29使用Eclipse RCP创建视图并实现视图间消息传递    private Text text_1;
30使用Eclipse RCP创建视图并实现视图间消息传递    private Text text;
31使用Eclipse RCP创建视图并实现视图间消息传递    @SuppressWarnings("unchecked")
32使用Eclipse RCP创建视图并实现视图间消息传递    ArrayList myListeners;
33使用Eclipse RCP创建视图并实现视图间消息传递    private ISelection selection;
34使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public DetailView() {
35使用Eclipse RCP创建视图并实现视图间消息传递        super();
36使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated constructor stub
37使用Eclipse RCP创建视图并实现视图间消息传递    }

38使用Eclipse RCP创建视图并实现视图间消息传递
39使用Eclipse RCP创建视图并实现视图间消息传递    @Override
40使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void createPartControl(Composite parent) {
41使用Eclipse RCP创建视图并实现视图间消息传递        final Composite composite = new Composite(parent, SWT.NONE);
42使用Eclipse RCP创建视图并实现视图间消息传递
43使用Eclipse RCP创建视图并实现视图间消息传递        final Group group = new Group(composite, SWT.NONE);
44使用Eclipse RCP创建视图并实现视图间消息传递        group.setBounds(0049462);
45使用Eclipse RCP创建视图并实现视图间消息传递
46使用Eclipse RCP创建视图并实现视图间消息传递        final Label label = new Label(group, SWT.NONE);
47使用Eclipse RCP创建视图并实现视图间消息传递        label.setText("姓名");
48使用Eclipse RCP创建视图并实现视图间消息传递        label.setBounds(10322412);
49使用Eclipse RCP创建视图并实现视图间消息传递
50使用Eclipse RCP创建视图并实现视图间消息传递        text = new Text(group, SWT.BORDER);
51使用Eclipse RCP创建视图并实现视图间消息传递        text.setBounds(40298015);
52使用Eclipse RCP创建视图并实现视图间消息传递
53使用Eclipse RCP创建视图并实现视图间消息传递        final Label label_1 = new Label(group, SWT.NONE);
54使用Eclipse RCP创建视图并实现视图间消息传递        label_1.setText("性别");
55使用Eclipse RCP创建视图并实现视图间消息传递        label_1.setBounds(172323012);
56使用Eclipse RCP创建视图并实现视图间消息传递
57使用Eclipse RCP创建视图并实现视图间消息传递        text_1 = new Text(group, SWT.BORDER);
58使用Eclipse RCP创建视图并实现视图间消息传递        text_1.setBounds(208298015);
59使用Eclipse RCP创建视图并实现视图间消息传递
60使用Eclipse RCP创建视图并实现视图间消息传递        final TableViewer tableViewer = new TableViewer(composite, SWT.BORDER);
61使用Eclipse RCP创建视图并实现视图间消息传递        table = tableViewer.getTable();
62使用Eclipse RCP创建视图并实现视图间消息传递        table.setLinesVisible(true);
63使用Eclipse RCP创建视图并实现视图间消息传递        table.setHeaderVisible(true);
64使用Eclipse RCP创建视图并实现视图间消息传递        table.setBounds(068494270);
65使用Eclipse RCP创建视图并实现视图间消息传递        initializeToolBar();
66使用Eclipse RCP创建视图并实现视图间消息传递    }

67使用Eclipse RCP创建视图并实现视图间消息传递
68使用Eclipse RCP创建视图并实现视图间消息传递    @Override
69使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void setFocus() {
70使用Eclipse RCP创建视图并实现视图间消息传递        // TODO Auto-generated method stub
71使用Eclipse RCP创建视图并实现视图间消息传递
72使用Eclipse RCP创建视图并实现视图间消息传递    }

73使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    private void initializeToolBar() {
74使用Eclipse RCP创建视图并实现视图间消息传递        IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();
75使用Eclipse RCP创建视图并实现视图间消息传递    }

76使用Eclipse RCP创建视图并实现视图间消息传递
77使用Eclipse RCP创建视图并实现视图间消息传递}

78 使用Eclipse RCP创建视图并实现视图间消息传递

(二)添加过detailview视图的perspective透视类:
 1 使用Eclipse RCP创建视图并实现视图间消息传递package  hellorcp.intro;
 2 使用Eclipse RCP创建视图并实现视图间消息传递
 3 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.ui.IPageLayout;
 4 使用Eclipse RCP创建视图并实现视图间消息传递 import  org.eclipse.ui.IPerspectiveFactory;
 5 使用Eclipse RCP创建视图并实现视图间消息传递
 6 使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递 public   class  Perspective  implements  IPerspectiveFactory  {
 7使用Eclipse RCP创建视图并实现视图间消息传递
 8使用Eclipse RCP创建视图并实现视图间消息传递使用Eclipse RCP创建视图并实现视图间消息传递    public void createInitialLayout(IPageLayout layout) {
 9使用Eclipse RCP创建视图并实现视图间消息传递        String editorArea = layout.getEditorArea();
10使用Eclipse RCP创建视图并实现视图间消息传递        layout.addView("hellorcp.navigationview", IPageLayout.LEFT, 0.15f, editorArea);
11使用Eclipse RCP创建视图并实现视图间消息传递        layout.addView("hellorcp.detailview", IPageLayout.LEFT, 1f, editorArea);
12使用Eclipse RCP创建视图并实现视图间消息传递    }

13使用Eclipse RCP创建视图并实现视图间消息传递}
以上步骤完成之后,我们第一阶段的工作就完毕了。让我们回顾一下,采取上述一系列步骤后,我们创建了一个简单的RCP应用,具备两个视图navigation view和detail view,前者以列表的形式显示人员信息,当用户点击列表上某一人员信息元素时,后者能够显示出该人员的详细信息,就这么简单,但是别忘了我们只完成了显示部分,而最重要、也是相对较为复杂的视图间消息传递部分,我们将放在后续部分继续讲解。
以下是我们完成的视图,检视一下,第一个RCP程序从自己手中诞生了,是不是有种成功的喜悦呢?
使用Eclipse RCP创建视图并实现视图间消息传递

使用Eclipse RCP创建视图并实现视图间消息传递(二)