【发布时间】:2011-01-14 17:21:23
【问题描述】:
在 Eclipse RCP 中,我正在使用 IPageLayout.addView(...) 为 Perspective 创建视图
但是这样我就没有对视图的引用。因此我不知道如何告诉 ViewA 更新 ViewB。
在这里使用的最佳模式是什么?
【问题讨论】:
标签: java eclipse-rcp
在 Eclipse RCP 中,我正在使用 IPageLayout.addView(...) 为 Perspective 创建视图
但是这样我就没有对视图的引用。因此我不知道如何告诉 ViewA 更新 ViewB。
在这里使用的最佳模式是什么?
【问题讨论】:
标签: java eclipse-rcp
除了上面提到的VonC之外,如果您需要的更改不是由选择触发的,您还可以使用ISourceProviderListener。
ViewB实现ISourceProviderListener
ISourceProvider 的实现并将其注册到服务中ViewA 获取ISourceProvider 并更新它以触发ViewB 中的更改
阅读有关这些接口的文档以及 IServiceLocator 和 ISourceProviderService,以更好地了解它们是如何发挥作用的。
您还可以查看this Lars Vogel's tutorial,其中有一些如何使用ISourceProvider 的示例
【讨论】:
ISourceProviderListener:我错过了那个。也很好的解决方案。 +1。现在将是“除了 VonC 提到的下面”;)
IBM article中总结了不同的通信范式
ISelectionListener 接口,并且必须将自身注册到工作台页面IAdaptable 接口:实现IAdaptable 的类能够动态返回某些类型的适配器,然后可用于检索更多信息。关于第一种方法,文章详述:
使用 UI 选择的更聪明的方法是将消费者视图注册为特定视图部分的侦听器。正如您在下面的示例中看到的,在注册选择侦听器期间,源视图部分的视图 ID 作为参数被提及。
getSite().getPage().addSelectionListener("SampleViewId",(ISelectionListener)this);
这种方法将消除消费者视图的冗余回调,如果该视图注册为非特定侦听器,则会发生这种情况。
清单 2 中的代码 sn-p 显示了一个视图的
createPartControl()方法,该方法创建了一个JFaceTableViewer并将其作为选择提供程序添加到工作台站点。此代码使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)中找到类似的方法
【讨论】:
视图和插件通信有不同的方式:事件代理、侦听器等。
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()。