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

在Eclipse RCP中,我使用IPageLayout.addView(...)为Perspective创建视图

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

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

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

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

阅读这些接口上的文档以及IServiceLocatorISourceProviderService以更好地了解它是如何发挥作用的。

您还可以看到这个Lars Vogel的教程 ,其中有一些示例如何使用ISourceProvider

您在IBM文章中总结了不同的通信范例

  • 要使视图能够监听选择更改,视图必须实现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); } 

您将在eclipse3.5的RCP教程中找到类似的方法(2010年2月更新)

视图和插件通信有不同的方式: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 }