有时候一个视图(
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);
}
}
});
分享到:
相关推荐
eclipse使用内部浏览器加载echarts,过程中可能存在鼠标移动事件不响应,这个是eclipse浏览器中与echarts.js内兼容问题,该问题可通过修改echarts.js解决,如果找不到可以私信我
2. 视图之间的交互机制:Eclipse RCP 的视图之间的交互机制,提供了视图之间的数据交互和事件交互机制。 七、Eclipse RCP 的注意事项 在 Eclipse RCP 的开发过程中,需要注意以下几点: 1.视图之间的交互机制需要...
用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);
在Eclipse RCP(Rich Client Platform)开发中,适配器(Adapter)机制是一个核心概念,它使得组件之间能够解耦合,实现灵活的交互。本文将深入探讨如何在RCP应用中通过适配器实现属性视图(Property View),以展示...
在Eclipse RCP中,适配器模式常用于连接不同组件,如视图、编辑器和命令,以实现功能的扩展和集成。 接下来,我们探讨如何在RCP应用中自定义属性视图。属性视图通常用于显示选定对象的详细信息,用户可以通过属性...
RCP界面布局实例着重于如何在RCP应用程序中有效地组织和管理用户界面元素,使得用户能够高效地与应用进行交互。本文将深入探讨RCP界面布局的相关知识点,并基于提供的"com.rcp.steve.crm"这一文件名,我们可以推测这...
RCP 打开视图的不同实例,并设置不同的值 ,创建一个视图,里面布局用了个tableviewer,通过一个Action,按钮打开该视图,每次打开的视图的内容可设置不同。 说明文档为 ...
VIEWER是RCP中的一个重要组成部分,它主要负责数据的展示和交互。VIEWER可以看作是一种特殊的控件,它可以显示不同类型的数据,并提供与这些数据的交互方式。在Eclipse RCP中,VIEWER通常用来展示列表、表格或树形...
学习这些示例,RCP初学者可以逐步掌握如何在Java环境中利用RCP框架搭建桌面应用,包括创建视图和对话框、实现用户交互、以及增强输入体验等功能。每个示例都应包含源代码和详细的注释,方便学习者跟踪和理解代码逻辑...
RCP允许开发者利用Eclipse的强大功能,如插件系统、工作台管理、视图和编辑器,来创建自定义的、模块化的用户界面。在本例子中,我们看到的是一个基于RCP实现的**客户关系管理(CRM)**系统。 CRM系统主要用于企业...
RCP允许开发者利用Java语言和Eclipse插件体系结构来创建可扩展、模块化的应用程序,这些应用程序可以具有丰富的用户界面和高度定制的功能。 RCP的关键组成部分包括: 1. **Workbench**:工作台是RCP应用的核心,它...
同时,事件模型使得插件可以监听并响应其他插件的事件,增强应用的动态性和响应性。 6. **国际化和本地化**:Eclipse RCP支持多语言环境,开发者需要了解如何实现应用程序的国际化和本地化,包括资源文件的处理和...
视图(Views)和编辑器(Editors)是 RCP 应用中的两种常见组件,视图通常用于显示辅助信息,而编辑器则用于处理和编辑数据。 9. 对话框(Dialogs) 对话框是用于与用户交互的临时窗口,如文件选择对话框、消息...
4. **工作台(Workbench)**:RCP中的工作台是整个用户界面的管理器,它负责控制窗口、视图、编辑器和菜单等元素的生命周期和交互。 5. **命令(Commands)与 Handler**:RCP采用命令设计模式,命令定义了操作行为...
在“RCP中文入门教程.pdf”中,你可能会学习到如何创建一个新的RCP项目,编写插件,定义扩展点,创建视图和编辑器,以及如何管理和配置用户的首选项。教程还可能涵盖如何调试和打包RCP应用,以及如何利用Eclipse的...
- **第一个RCP程序**:通常从创建一个新的Eclipse插件项目开始,然后定义工作台视图和编辑器,实现基本的用户交互。 - **插件开发环境(PDE)**:Eclipse内置的工具集,用于开发、调试和管理RCP应用程序和插件。 ...
4. **菜单和工具栏**:Eclipse RCP允许自定义菜单和工具栏,这些可以通过`Action`类实现。你可以创建`MenuManager`和`ToolBarManager`来管理这些动作,并在编辑器的上下文中添加它们。 5. **事件处理**:RCP编辑器...
Rich Client Platform(RCP)是Eclipse的扩展平台,它允许开发者创建功能丰富的、可扩展的应用程序,这些应用可以拥有自己的工作台、视图、编辑器和菜单。 1. **Eclipse SWT**:SWT是Eclipse项目的一个重要组成部分...
【RCP产品介绍图片】是针对RCP(Rich Client Platform)技术的一种视觉呈现方式,它...通过这些RCP产品介绍图片,我们可以直观地理解RCP的架构、工作流程和用户交互方式,从而更好地掌握这一强大的桌面应用开发平台。
**:通过创建一个简单的RCP应用,展示基础的RCP结构,包括主应用程序类、启动配置和基本视图。 3. **插件开发**:讲解如何创建和管理插件,包括编写插件描述符(plugin.xml)、定义插件依赖以及编写Java代码实现...