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

RCP 视图交互 ISelectionProvider和ISelectionListener,只响应鼠标左键

阅读更多

 

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

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

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

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

调停者模式
Blabla...

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

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() 方法就会被调用。

 

 

 

以上是网上搜索出来的,确实是正确的,但是本人在使用过程中发现,鼠标右键点击也会触发视图的交互,所以我改进了:

 

protected void hookControl(Control control) {

tableViewer.addSelectionChangedListener(new ISelectionChangedListener(){

public void selectionChanged(SelectionChangedEvent event) {

ISelection selection2 = event.getSelection();

setSelection(selection2);

}

});

}

 替换为:

viewer.getTree().addMouseListener(new MouseAdapter() {

			@Override
			public void mouseDown(MouseEvent e) {
				super.mouseDown(e);
				//鼠标右键不执行读取视图表格内容的操作
				if (e.button == 3) {
					return;
				}else
				{
					ISelection selection2 = viewer.getSelection();
					setSelection(selection2);
				}
			}
		});
 

 

分享到:
评论

相关推荐

    rcp视图中嵌套eclipse使用内部浏览器加载echarts

    eclipse使用内部浏览器加载echarts,过程中可能存在鼠标移动事件不响应,这个是eclipse浏览器中与echarts.js内兼容问题,该问题可通过修改echarts.js解决,如果找不到可以私信我

    EclipseRCP教程

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

    RCP 视图显示GEF图

    用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);

    RCP中adapter实现属性视图

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

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

    在Eclipse RCP中,适配器模式常用于连接不同组件,如视图、编辑器和命令,以实现功能的扩展和集成。 接下来,我们探讨如何在RCP应用中自定义属性视图。属性视图通常用于显示选定对象的详细信息,用户可以通过属性...

    RCP 界面布局实例

    RCP界面布局实例着重于如何在RCP应用程序中有效地组织和管理用户界面元素,使得用户能够高效地与应用进行交互。本文将深入探讨RCP界面布局的相关知识点,并基于提供的"com.rcp.steve.crm"这一文件名,我们可以推测这...

    RCP 打开视图的不同实例,并设置不同的值,工程代码可运行

    RCP 打开视图的不同实例,并设置不同的值 ,创建一个视图,里面布局用了个tableviewer,通过一个Action,按钮打开该视图,每次打开的视图的内容可设置不同。 说明文档为 ...

    RCP的VIEWER和EDITOR

    VIEWER是RCP中的一个重要组成部分,它主要负责数据的展示和交互。VIEWER可以看作是一种特殊的控件,它可以显示不同类型的数据,并提供与这些数据的交互方式。在Eclipse RCP中,VIEWER通常用来展示列表、表格或树形...

    rcp.zip_DEMO_RCP dialog_java rcp_rcp

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

    一个RCP的简单例子

    RCP允许开发者利用Eclipse的强大功能,如插件系统、工作台管理、视图和编辑器,来创建自定义的、模块化的用户界面。在本例子中,我们看到的是一个基于RCP实现的**客户关系管理(CRM)**系统。 CRM系统主要用于企业...

    RCP与GEF课件,介绍RCP和GEF各组成部分和工作原理

    RCP允许开发者利用Java语言和Eclipse插件体系结构来创建可扩展、模块化的应用程序,这些应用程序可以具有丰富的用户界面和高度定制的功能。 RCP的关键组成部分包括: 1. **Workbench**:工作台是RCP应用的核心,它...

    eclipse rcp应用系统开发方法与实战源代码.zip

    同时,事件模型使得插件可以监听并响应其他插件的事件,增强应用的动态性和响应性。 6. **国际化和本地化**:Eclipse RCP支持多语言环境,开发者需要了解如何实现应用程序的国际化和本地化,包括资源文件的处理和...

    Eclipse_RCP_自学教程.doc

    视图(Views)和编辑器(Editors)是 RCP 应用中的两种常见组件,视图通常用于显示辅助信息,而编辑器则用于处理和编辑数据。 9. 对话框(Dialogs) 对话框是用于与用户交互的临时窗口,如文件选择对话框、消息...

    RCP程序设计

    4. **工作台(Workbench)**:RCP中的工作台是整个用户界面的管理器,它负责控制窗口、视图、编辑器和菜单等元素的生命周期和交互。 5. **命令(Commands)与 Handler**:RCP采用命令设计模式,命令定义了操作行为...

    RCP中文入门教程.rar

    在“RCP中文入门教程.pdf”中,你可能会学习到如何创建一个新的RCP项目,编写插件,定义扩展点,创建视图和编辑器,以及如何管理和配置用户的首选项。教程还可能涵盖如何调试和打包RCP应用,以及如何利用Eclipse的...

    RCP程序设计教程打包

    - **第一个RCP程序**:通常从创建一个新的Eclipse插件项目开始,然后定义工作台视图和编辑器,实现基本的用户交互。 - **插件开发环境(PDE)**:Eclipse内置的工具集,用于开发、调试和管理RCP应用程序和插件。 ...

    rcp editor实例的项目代码

    4. **菜单和工具栏**:Eclipse RCP允许自定义菜单和工具栏,这些可以通过`Action`类实现。你可以创建`MenuManager`和`ToolBarManager`来管理这些动作,并在编辑器的上下文中添加它们。 5. **事件处理**:RCP编辑器...

    EclipseSWT_JFace_RCP插件开发

    Rich Client Platform(RCP)是Eclipse的扩展平台,它允许开发者创建功能丰富的、可扩展的应用程序,这些应用可以拥有自己的工作台、视图、编辑器和菜单。 1. **Eclipse SWT**:SWT是Eclipse项目的一个重要组成部分...

    RCP 产品介绍图片

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

    RCP开发入门-PDF.7z

    **:通过创建一个简单的RCP应用,展示基础的RCP结构,包括主应用程序类、启动配置和基本视图。 3. **插件开发**:讲解如何创建和管理插件,包括编写插件描述符(plugin.xml)、定义插件依赖以及编写Java代码实现...

Global site tag (gtag.js) - Google Analytics