【问题标题】:How to communicate between views in Eclipse RCP?如何在 Eclipse RCP 中的视图之间进行通信?
【发布时间】:2011-01-14 17:21:23
【问题描述】:

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

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

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

【问题讨论】:

    标签: java eclipse-rcp


    【解决方案1】:

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

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

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

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

    【讨论】:

    • ISourceProviderListener:我错过了那个。也很好的解决方案。 +1。现在将是“除了 VonC 提到的下面”;)
    • 可悲的是,这不再是 e4 中的工作方式。没有更多的视图和编辑器,只有......部分。对于 e4,似乎很难找到有关它们之间如何通信的信息。对于其他正在寻找的人,this newer tutorial 似乎指明了方向。
    【解决方案2】:

    IBM article中总结了不同的通信范式

    • 要使视图能够侦听选择更改,视图必须实现 ISelectionListener 接口,并且必须将自身注册到工作台页面
    • 使用IAdaptable 接口:实现IAdaptable 的类能够动态返回某些类型的适配器,然后可用于检索更多信息。
    • 属性更改侦听器范例

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

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

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

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

    清单 2 中的代码 sn-p 显示了一个视图的 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)中找到类似的方法

    【讨论】:

      【解决方案3】:

      视图和插件通信有不同的方式:事件代理、侦听器等。

      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 
      }
      

      【讨论】:

      • 我不会复制STATUS 变量(只需将它作为public static final String 并从发送者和接收者引用它),否则,这是在e4 中的方法。顺便说一句,您可以通过这种方式发送任何您喜欢的对象,而不仅仅是字符串,如果您想让这种情况异步发生,请使用broker.post() 而不是broker.send()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2016-01-05
      • 1970-01-01
      相关资源
      最近更新 更多