在Eclipse RCP中,我使用IPageLayout.addView(...)
但是这种方式我没有对视图的引用。因此,我不知道如何告诉ViewA更新ViewB。
这里使用的最佳模式是什么?
答案 0 :(得分:15)
除了上面提到的VonC之外,如果您所需的更改不是由选择触发,您也可以使用ISourceProviderListener
。
ViewB
实施ISourceProviderListener
ISourceProvider
的实施并在服务中注册ViewA
获取ISourceProvider
并更新它以触发ViewB
阅读这些界面上的文档以及IServiceLocator
和ISourceProviderService
,以便更好地了解这些界面是如何发挥作用的。
您还可以看到this Lars Vogel's tutorial,其中有一些示例如何使用ISourceProvider
答案 1 :(得分:8)
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);
}
中找到类似的方法
答案 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
}