我正在使用RCP中的属性视图,即org.eclipse.ui.views.properties.PropertySheet
。如何刷新Eclipse RCP中的属性视图?
我希望能够以编程方式刷新这些属性的内容。看起来RCP适用于仅在选择发生变化时才发生更改的用例。
有没有什么办法可以触发一个虚拟事件来让它刷新(没有丑陋的UI工件,比如明显地在零件之间切换)?
我正在使用RCP中的属性视图,即org.eclipse.ui.views.properties.PropertySheet
。如何刷新Eclipse RCP中的属性视图?
我希望能够以编程方式刷新这些属性的内容。看起来RCP适用于仅在选择发生变化时才发生更改的用例。
有没有什么办法可以触发一个虚拟事件来让它刷新(没有丑陋的UI工件,比如明显地在零件之间切换)?
主要问题是API隐藏了属性视图中的所有页面(PropertySheetPage),因此隐藏了查看者(PropertySheetViewer)。
好消息是,你可以告诉属性视图使用你的愿望页面。因此,我提供默认情况下会使用的页面(PropertySheetPage),除非我提供它,我保留对它的引用(显然),然后可以调用propertySheetPageRef.refresh()
来更新模型(幸好此方法是公开的)。
public Object getAdapter(Class adapter) {
if (adapter == IPropertySource.class) {
return resultProvider;
} else if (adapter == IPropertySheetPage.class) {
return propertySheetPage;
}
return null;
}
更正geejay的答案:getAdapter方法在视图中(而不是在您显示属性的对象中)。
样品实现(在视图的类):
//IPropertySheetPage doesn't implement refresh()
private PropertySheetPage propertyPage;
/**
* If called from UI thread, refreshes property page from model
* (an IPropertySource). If called from non-UI thread, does nothing.
*/
public void refreshPropertyPage() {
if (propertyPage != null) {
propertyPage.refresh();
}
}
@Override
public Object getAdapter(Class adapter) {
if (adapter == IPropertySheetPage.class) {
if (propertyPage == null) {
propertyPage = new PropertySheetPage();
}
return propertyPage;
}
//use platform's adapter manager for other classes
return super.getAdapter(adapter);
}