`
qq123zhz
  • 浏览: 534493 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

RCP 视图间的交互机制

阅读更多

有时候一个视图(View)希望得到另外一个视图显示的内容,或者选择的内容。在Eclipse中,比较标准的做法是通过ISelectionProviderISelectionListener来完成的。不过因为视图往往是独立的,他们之间并不太方便进行直接的事件监听,而且往往一个视图需要对诸多试图进行选择事件的监听,因此在这种情况下对每一个视图的事件进行注册,比较繁琐,有时候也不可能(比如在需要被监听的试图尚未激活的情况下)。

比较典型的例子就是Eclipse本身所提供的PropertySheetOutline这两个视图,他们都是对其它试图或者Editor中的选择进行监听,并更具选择的内容作相应的处理,显示其Outline或者属性页。

 Eclipse为了解决这个问题,提供了所谓的Site,以及ISelectionService机制,来处理试图之间的简单的交互。简单的说,ViewSite提供了一个交互的中心点,其它ViewViewSite提供选择事件,或者向其注册监听器,而事件的触发与转发则由ViewSite()来完成。

这应该也是一个设计模式,不过我还没想到比较接近的设计模式的名字。如果勉强要使用一个的话,我认为“Mediator”(调停者模式)可能比较适合(欢迎发表见解)。 

调停者模式Blabla...

为了在这个机制中扮演角色,视图通常需要实现两类接口,或者Adapter。首先是作为被监听方的视图,需要实现ISelectionProvider接口。ISelectionProviderJface中引入的接口。

       public interface ISelectionProvider {

           public void addSelectionChangedListener(ISelectionChangedListener listener);

           public ISelection getSelection();

           public void removeSelectionChangedListener(

                   ISelectionChangedListener listener);

           public void setSelection(ISelection selection);

       }

方法都比较简单,不做一一阐述。具体实现时,可能需要进行所谓的hookControl,也就是将View中具体控件的事件,关联到这个View所提供的ISelectionProvider上,简单的一个例子,如果View中控件是一个TableViewer的话,那么可以做如下的操作:

       protected void hookControl(Control control) {

       tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){

              public void selectionChanged(SelectionChangedEvent event) {

                     ISelection selection2 = event.getSelection();

                     setSelection(selection2);

              }

       });

       }

 

然后再setSelection()中对事件进行扩散(propagate

       public void setSelection(ISelection selection) {

              this.selection = selection;

              SelectionChangedEvent event2 = new SelectionChangedEvent(

                            OntIndividualEditor.this, selection);

              for (Iterator i = selectionChangeListeners.iterator(); i.hasNext();) {

                     ISelectionChangedListener object = (ISelectionChangedListener) i

                                   .next();

                     object.selectionChanged(event2);

              }

       }

 

一个ISelectionProvider如果希望被别的View进行监听的话,则应该向其Site()进行注册:

       this.getSite().setSelectionProvider(this);

如果事件比较简单,比如上面的例子,只是对TableViewer的选择进行监听,因为TableViewer本身就是一个ISelectionProvider,因此可以直接这样做:

       this.getSite().setSelectionProvider(tableViewer);

这样View本身就不必实现ISelectionProvider接口了,但是实现的效果同上面的方式实现的是一样的。

 作为事件监听的另一端,则更为简单一些。只需要实现ISelectionListener接口,并注册在Site中:

       site.getPage().addSelectionListener(this);

然后实现public void selectionChanged(IWorkbenchPart part, ISelection selection) {}方法即可。这样,当SelectionProvider中的选择发生改变时,这个视图中的selectionChanged()方法就会被调用。

 注意SelectionProviderSelectionListener并不直接对应。这个地方有一点容易混淆,就是Eclipse实际上提供有两套与Selection相关的事件与接口:

ISelectionChangedListener <--> ISelectionProvider

这个是JFace中的选择监听机制,对试图或者控件而言,它提供对原始的选择事件的通知与响应。ISelectionProvider需要注册在Site上,以供ISelectionSerivce使用,将选择事件扩散到其他的ISelectionListener中。

ISelectionListener <--> ISelectionService

这个是在Site中使用的,ISelectionService不需要自己实现,已经实现好了,ISelectionListener则需要注册到ISelectionService上,以对其它SelectionProvider的事件响应进行监听。

 Eclipse本身的实现中,PropertySheetOutline都使用了这种机制。不过需要注意的是,缺省的PropertyShee需要接受一个IStructuredSelection,而不仅仅是一个ISelection。因此,如果ISeletionProvider需要提供一个能够让PropertySheet进行显示的对象的话,除了除了要实现ISelection接口外,还需要对其进行封装成一个IStructuredSelection。这个比较简单,直接调用StructuredSelection构造函数即可。

 

分享到:
评论

相关推荐

    EclipseRCP教程

    2. 视图之间的交互机制:Eclipse RCP 的视图之间的交互机制,提供了视图之间的数据交互和事件交互机制。 七、Eclipse RCP 的注意事项 在 Eclipse RCP 的开发过程中,需要注意以下几点: 1.视图之间的交互机制需要...

    RCP中adapter实现属性视图

    在Eclipse RCP(Rich Client Platform)开发中,适配器(Adapter)机制是一个核心概念,它使得组件之间能够解耦合,实现灵活的交互。本文将深入探讨如何在RCP应用中通过适配器实现属性视图(Property View),以展示...

    RCP程序设计教程打包

    - **扩展点(Extension Points)**:定义插件可以插入其他插件的点,是RCP插件间交互的关键机制。 - **服务(Services)**:通过服务定位获取其他插件提供的功能,实现组件间的解耦。 - **事件总线(Event Bus)*...

    基于适配器模式的RCP应用属性视图实现

    本文将深入探讨如何在基于Eclipse RCP(Rich Client Platform)的应用中,利用适配器模式实现自定义的属性视图。Eclipse RCP是一个强大的框架,用于构建桌面应用程序,而属性视图则是展示对象属性的一种可视化组件。...

    RCP 界面布局实例

    同时,利用RCP的事件机制,可以响应用户交互,动态更新界面布局。 总结来说,RCP界面布局实例涉及了视图、编辑器、透视图等关键概念,以及堆叠布局、网格布局等多种布局策略。通过理解和熟练运用这些知识点,开发者...

    RCP 资料

    10. **事件(Event)**:RCP中的事件机制用于在组件间传递信息。当一个对象的状态改变时,可以通过发布事件通知其他对象。 Eclipse RCP的灵活性和可扩展性使其成为开发复杂企业级应用的理想选择。通过深入学习和...

    EclipseRcp 例子程序

    在“Eclipse RCP 例子程序”中,我们可能找到一系列的示例代码和项目,这些示例展示了如何利用Eclipse RCP的各种组件和机制来构建实际的应用。以下是一些关键的知识点: 1. **插件系统**:Eclipse RCP的核心是其...

    一个RCP的简单例子

    开发者需要定义工作台的布局,以及如何在不同视图间切换。 2. **插件(Plugins)**:Eclipse RCP的基础是插件架构,允许模块化开发。每个功能或组件都可以作为一个独立的插件实现,这样可以提高代码的重用性和可...

    Eclipse RCP培训.zip

    8. **模型-视图-控制器(MVC)**:Eclipse RCP遵循MVC设计模式,模型负责数据管理,视图负责显示,控制器处理用户输入和模型-视图间的交互。 9. **透视图(Perspective)**:透视图是工作台的一种布局,可以包含多...

    rcp 学习资料下载,一个简单的rcp例子

    4. **服务(Service)机制**: 学习如何定义和使用服务,以实现组件间的通信。 5. **国际化(i18n)和本地化(l10n)**: 如何为应用添加多语言支持。 6. **插件依赖**: 理解插件间的依赖关系,以及如何在MANIFEST.MF...

    RCP的VIEWER和EDITOR

    同时,Eclipse RCP提供了一套强大的事件机制,使得VIEWER和EDITOR之间的通信变得简单,例如,当用户在VIEWER中选择了一个项时,可以触发一个事件,使得相关的EDITOR更新其内容以反映所选项的详细信息。 总的来说,...

    Eclipse RCP 初级入门教程

    掌握RCP的基础只是第一步,更深入的学习包括使用MDI(多文档界面)、SWT/JFace高级特性、E4新框架、P2更新机制以及Eclipse RCP在企业级应用中的实践等。 总的来说,"Eclipse RCP 初级入门教程"是一个很好的起点,为...

    rcp工程的描述

    总结来说,RCP是一种强大的开发平台,它利用`features`和`plugins`目录组织和管理代码,通过OSGi和扩展点机制实现模块间的交互,结合工作台和模型驱动开发,提供了一个高效、可扩展的桌面应用程序开发环境。...

    Eclipse RCP开发教程

    Eclipse RCP 的核心理念是模块化和组件化,通过插件和扩展点机制实现应用程序的功能拆分和复用。 **1. 富客户端平台** 1.1. 概述 Eclipse RCP 提供了一种构建用户界面的方法,它基于 Java 技术,支持图形化界面和...

    RCP开发入门资料(手把手教学)

    三、RCP视图和透视图 在RCP应用中,视图(View)是用户界面的主要组成部分,它们展示了应用程序的数据和功能。透视图(Perspective)则负责组织和管理视图,为用户提供不同的工作环境。开发者可以自定义视图和透视图...

    rcp.zip_DEMO_RCP dialog_java rcp_rcp

    学习这些示例,RCP初学者可以逐步掌握如何在Java环境中利用RCP框架搭建桌面应用,包括创建视图和对话框、实现用户交互、以及增强输入体验等功能。每个示例都应包含源代码和详细的注释,方便学习者跟踪和理解代码逻辑...

    eclipse-rcp开发培训PPT

    4. **模型(Model)**:Eclipse RCP采用MVC(Model-View-Controller)设计模式,模型负责数据的存储和处理,视图负责显示,控制器负责两者间的交互。 **二、Eclipse RCP开发流程** 1. **环境搭建**:首先,你需要...

    RCP中文入门教程.rar

    2. **工作台(Workbench)**:工作台是RCP应用的中心,它管理着所有打开的窗口、视图和编辑器。开发者可以通过工作台API来控制应用程序的布局和交互。 3. **模型(Model)**:RCP支持基于模型的开发,这意味着数据...

    RCP 产品介绍图片

    【RCP产品介绍图片】是针对RCP(Rich Client Platform)技术的一种视觉呈现方式,它...通过这些RCP产品介绍图片,我们可以直观地理解RCP的架构、工作流程和用户交互方式,从而更好地掌握这一强大的桌面应用开发平台。

Global site tag (gtag.js) - Google Analytics