有时候一个视图(
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);
}
}
});
分享到:
相关推荐
用视图显示在GEF编辑器编辑好的图形 在视图里加入GraphicalViewer viewer = new ScrollingGraphicalViewer(); viewer.createControl(parent);
eclipse使用内部浏览器加载echarts,过程中可能存在鼠标移动事件不响应,这个是eclipse浏览器中与echarts.js内兼容问题,该问题可通过修改echarts.js解决,如果找不到可以私信我
RCP 打开视图的不同实例,并设置不同的值 ,创建一个视图,里面布局用了个tableviewer,通过一个Action,按钮打开该视图,每次打开的视图的内容可设置不同。 说明文档为 ...
RCP中使用adapter扩展模型为IPropertySource,达到显示属性视图的目的;详细介绍了各种适配器方式。
基于适配器模式的RCP应用属性视图实现,在做RCP或者Eclipse插件开发的朋友可以用到的,关于如何自定义属性栏信息
如 SafeRunner 提供了异常记入日志的功能、BusyIndicator 可以屏蔽鼠标事件,使得当前程序专注于处理一件事,而不使程序出现死的状态,鼠标变为漏斗状。本文尽可能详细的介绍这些类,用示例代码展示它们的用法,相信...
RCP&OSGI;
RCP在线升级RCP在线升级RCP在线升级RCP在线升级RCP在线升级
RCP与GEF的课件,简单的介绍了RCP和GEF中的各组件的功能,已经工作流程
火龙果软件工程技术中心 EclipseRCP开发中,和用户进行交互最多的界面,应该是视图了,而透视图就是将已有的视图、菜单、工具栏、编辑器等等进行组合和布局。看完这一节,我们就可以建立如下图这样的程序界面了。...
Eclipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作. ...
RCP的VIEWER和EDITOR做成的压缩包,可以下载了看看,是转载了别人的,不过忘了哪弄的了
clipse RCP允许开发者使用eclipse结构风格设计弹性的可扩展的应用程序,可重用Eclipse中已存在的方法和编码模式。俗话说,万事开头难。Eclipse RCP入手可能会比较困难、费时。接下来我们将主要讲述如何让RCP工作 ...
RCP导出EXE 老大难问题。 RCp 程序导出步骤,保证能够导出~
有关rcp项目创建,视图创建。 开发插件项目基础
1.2.Eclipse RCP 建设风格——插件,扩展和扩展点 1 2.创建你的第一个RCP程序 1 2.1.创建一个RCP程序 2 2.2.启动你的RCP程序 5 2.3.应用程序VS 产品 6 3.应用程序里的插件ID 7 4.Actions的用法(菜单和...
RCP 界面布局实例 主要描述视图布局
RCP 常见的扩展点指南 RCP最精华的部分之一,详细分析了RCP如何建立扩展点的。
RCP系统使用的弹出式日期控件,可切换上月下月,前一年后一年,可选择年、月
有关rcp的内容 是rcp入门的好帮手,rcp自学的好帮手