如何在Eclipse RCP中的视图之间进行通信?

时间:2010-02-09 08:32:08

标签: java eclipse-rcp

在Eclipse RCP中,我使用IPageLayout.addView(...)

为Perspective创建视图

但是这种方式我没有对视图的引用。因此,我不知道如何告诉ViewA更新ViewB。

这里使用的最佳模式是什么?

3 个答案:

答案 0 :(得分:15)

除了上面提到的VonC之外,如果您所需的更改不是由选择触发,您也可以使用ISourceProviderListener

  • ViewB实施ISourceProviderListener
  • 创建ISourceProvider的实施并在服务中注册
  • ViewA获取ISourceProvider并更新它以触发ViewB
  • 中的更改

阅读这些界面上的文档以及IServiceLocatorISourceProviderService,以便更好地了解这些界面是如何发挥作用的。

您还可以看到this Lars Vogel's tutorial,其中有一些示例如何使用ISourceProvider

答案 1 :(得分:8)

您在IBM article

中总结了不同的沟通范例
  • 要使视图能够监听选择更改,视图必须实现ISelectionListener接口,并且必须在工作台页面中注册自己
  • 使用IAdaptable接口:实现IAdaptable的类能够动态返回某些类型的适配器,然后可以使用这些适配器来检索更多信息。
  • 属性更改侦听器范例

关于第一种方法,文章详述:

  

使用UI选择的更智能方法是将使用者视图注册为特定视图部件的侦听器。正如您在下面的示例中所看到的,在注册选择侦听器期间,会将源视图部件的视图ID作为参数提及。

  getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this);
  

这种方法将消除对消费者视图的冗余回调,如果该视图被注册为非特定侦听器,则会发生这种回调。

     

清单2中的代码片段显示了创建createPartControl() JFace的视图的TableViewer方法,并将其作为选择提供程序添加到工作台网站。此代码允许TableViewer中的任何UI选择更改传播到页面,最后传播到感兴趣的消费者视图。

     

清单2.设置选择提供者

public void createPartControl(Composite parent) {
    // Set up a JFace Viewer
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
    viewer.setContentProvider(new ViewContentProvider());
    viewer.setLabelProvider(new ViewLabelProvider());
    viewer.setSorter(new NameSorter());
    viewer.setInput(getViewSite());

    // ADD the JFace Viewer as a Selection Provider to the View site.
    getSite().setSelectionProvider(viewer);

}

您会在RCP tutorial for eclipse3.5 (update February, 4th 2010)

中找到类似的方法

答案 2 :(得分:1)

视图和插件通信有不同的方式:eventbroker,listener等..

EvenBroker(e4)实施: 使用eventbroker在视图和插件之间发送消息(字符串)。

发件人方:

@Inject
private IEventBroker eventBroker; 
private static final String STATUS ="status";
eventBroker.send(STATUS, "status test message..");

接收方:

@Inject
private IEventBroker eventBroker; 
private static final String STATUS ="status";
@Inject @Optional
public void  getEvent(@UIEventTopic(STATUS) String message) {
    ... //call method 
}