`
hiwings
  • 浏览: 59784 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

RCP常用监听机制

 
阅读更多

http://www.ibm.com/developerworks/cn/opensource/os-ecllink/

 

1:IPartListener 对每个part的监听,如:关闭、隐藏。。。等。 所以 每个part的状态你的可以检测到。

 

很有用的:

1:你可以在每个窗口关闭后,删除 对应工具栏 ,打开时 在添加对应工具栏。

2: 在每个窗口关闭后,另外窗口作出相应变化。

 

 

 

注册方式: this.getSite().getPage().addPartListener(listener)

2:ISelectionListener 这个与ISelectionProvider 配合使用,对选择的内容进行实时监听。

 

注册监听:this.getSite().getPage().addSelectionListener(listener)

注册选择提供者:this.getSite().setSelectionProvider(provider)

 

  1. 在RCP编程时,我们经常要取得IWorkbenchPage,如果是从视图中得到,可以用下面的方法:

在RCP编程时,我们经常要取得IWorkbenchPage,如果是从视图中得到,可以用下面的方法:


Java代码 复制代码 收藏代码
  1. IWorkbenchPage workbenchPage = getViewSite().getPage();

IWorkbenchPage workbenchPage = getViewSite().getPage();


Java代码 复制代码 收藏代码
  1. 有时不是从视图,而是要从外部取得IWorkbenchPage,例如从菜单或者工具栏等,这时,可以使用下面的方法:

有时不是从视图,而是要从外部取得IWorkbenchPage,例如从菜单或者工具栏等,这时,可以使用下面的方法:


Java代码 复制代码 收藏代码
  1. IWorkbenchPage workbenchPage = Plugin.getDefault().getWorkbench().
  2. getActiveWorkbenchWindow().getActivePage();

IWorkbenchPage workbenchPage = Plugin.getDefault().getWorkbench(). getActiveWorkbenchWindow().getActivePage();


Java代码 复制代码 收藏代码
  1. 其中的Plugin是你的RCP最初建立时一般由Eclipse生成的,其父类为AbstractUIPlugin,当然,你也可以自己写。
  2. 一般申明为:

其中的Plugin是你的RCP最初建立时一般由Eclipse生成的,其父类为AbstractUIPlugin,当然,你也可以自己写。 一般申明为:


Java代码 复制代码 收藏代码
  1. /* The activator class controls the plug-in life cycle */

/* The activator class controls the plug-in life cycle */


Java代码 复制代码 收藏代码
  1. public class AuditPlugin extends AbstractUIPlugin {

public class AuditPlugin extends AbstractUIPlugin {


Java代码 复制代码 收藏代码
  1. 还有一种方法也可以得到:

还有一种方法也可以得到:


Java代码 复制代码 收藏代码
  1. IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().
  2. etActiveWorkbenchWindow().getActivePage();

IWorkbenchPage workbenchPage = PlatformUI.getWorkbench(). getActiveWorkbenchWindow().getActivePage();


Java代码 复制代码 收藏代码
  1. 在程序中的实例: //得到IworkbenchPage对象,找到com.raul.views.ShootViewPart这个视图,
  2. 然后执行视图里面的射门方法

在程序中的实例: //得到IworkbenchPage对象,找到com.raul.views.ShootViewPart这个视图,然后执行视图里面的射门方法


Java代码 复制代码 收藏代码
  1. update.addSelectionListener(new SelectionAdapter() {
  2. public void widgetSelected(SelectionEvent e) {
  3. IWorkbenchPage workbenchPage = Activator.getDefault().
  4. getWorkbench().getActiveWorkbenchWindow().getActivePage();
  5. ShootViewPart shootView = (ShootViewPart)
  6. workbenchPage.findView("com.raul.views.ShootViewPart");
  7. shootView.shoot(); } });

update.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { IWorkbenchPage workbenchPage = Activator.getDefault(). getWorkbench().getActiveWorkbenchWindow().getActivePage(); ShootViewPart shootView = (ShootViewPart) workbenchPage.findView("com.raul.views.ShootViewPart"); shootView.shoot(); } });


Java代码 复制代码 收藏代码
  1. 有的时候,我们需要获取目标视图中当前选择的元素,可以直接这样做:

有的时候,我们需要获取目标视图中当前选择的元素,可以直接这样做:


Java代码 复制代码 收藏代码
  1. IViewPart viewPart = AuditPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow().
  2. getActivePage().findView("org.eclipse.ui.navigator.ProjectExplorer");
  3. StructuredSelection sl = (StructuredSelection) viewPart.getSite().getSelectionProvider().
  4. getSelection(); Object obj = sl.getFirstElement();

IViewPart viewPart = AuditPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow(). getActivePage().findView("org.eclipse.ui.navigator.ProjectExplorer"); StructuredSelection sl = (StructuredSelection) viewPart.getSite().getSelectionProvider(). getSelection(); Object obj = sl.getFirstElement();


Java代码 复制代码 收藏代码
  1. //然后对obj进行各种操作这样就只用知道视图的id即可,不需要转换该视图类。

有时候一个视图(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构造函数即可。

分享到:
评论

相关推荐

    安卓Android源码——高仿生日管家.zip

    "rcp_birthday"这个文件名可能是项目中某个模块或者组件的名称,"rcp"可能是"Rich Client Platform"的缩写,虽然在Android中不常用,但可能表示这是一个具有丰富用户界面的部分。"birthday"则直接对应了应用的主题,...

    Android课程设计视频播放器设计.pdf

    Eclipse作为常用的Java开发环境,它的基础是富客户端平台RCP,包括核心平台、OSGi、SWT和JFace组件。SWT是Eclipse的图形界面库,性能优于Java的AWT和Swing,JFace则简化了UI构建。Eclipse的插件机制非常灵活,允许...

    Eclipse_Swt_Jface_核心应用_部分19

    3.3 常用的代码编辑功能 28 3.3.1 添加注释 28 3.3.2 自定义格式化代码 28 3.3.3 自动生成getter和setter代码 30 3.3.4 代码的重构 31 3.3.5 查看源代码 31 3.3.6 代码的展开和折叠 32 3.3.7 代码比较...

    OSGi 入门+进阶+实战

    3. **Eclipse RCP开发**:Eclipse Rich Client Platform(RCP)是一个基于OSGi的应用开发框架,适用于开发桌面应用。 4. **企业应用案例**:OSGi常用于企业应用服务器(如Apache Karaf)和嵌入式系统,如路由器、...

    servlet 学习基础资料 ppt

    - **胖客户端(RCP)**:需要在计算机上安装程序才能运行,如桌面应用程序。优点是可以高效使用软件功能,但缺点是需要安装且不易跨平台使用。 - **瘦客户端(TCP)**:不需要在客户端安装程序,只要有浏览器就能使用...

    eclipse插件开发

    “pdf、pdg格式文件如何打开说明.txt”则指导你如何处理不同格式的电子文档,PDF是通用的文档格式,而PDG是中国早期扫描图书常用的格式,需要专门的阅读软件。 总的来说,Eclipse插件开发是一个涉及OSGi、Java编程...

    swt写的类win记事本

    6. **Event handling**:SWT提供了丰富的事件处理机制,开发者需要编写监听器来响应用户的操作,如点击按钮、选择菜单项等。 7. ** SWT/AWT Bridge**:在某些情况下,开发者可能需要将SWT组件与Java标准GUI库AWT...

    配套源码_可视化JAVA SWT JFACE GUI程序设计教程

    Java SWT (Standard Widget Toolkit) 和 JFace 是两个用于构建图形用户界面(GUI)的库,它们都是Java编程语言的一部分,特别是在开发桌面应用程序时非常常用。本教程配套源码是为"可视化JAVA SWT JFACE GUI程序设计...

    华为内部Linux培训资料

    资料介绍了FTP远程文件传输、Telnet远程登录、R-系列命令(如`rcp`、`rlogin`)的使用方法,这些都是进行远程管理和数据交换的基础。 ### 常用使用技巧 #### 软件包的安装与卸载 资料详细讲解了RPM包管理工具的...

    linux拷贝命令之高级拷贝scp命令详解

    `scp`命令使用与SSH相同的加密和认证机制,确保数据在传输过程中的安全性。与`rcp`不同,当需要身份验证时,`scp`会提示用户输入密码或密钥,增强了安全性。 ### 总结 `scp`命令是Linux系统中进行安全文件传输的...

    JavaEE(权威)

    - **Rich Client Platform (RCP)**:用于构建富客户端应用程序。 ##### 1.4.3 Web 层组件 Web 层组件主要包括: - **Servlets**:用于处理 HTTP 请求和响应。 - **JSP**:用于动态生成 HTML 内容。 - **JSF**:一...

Global site tag (gtag.js) - Google Analytics