我正在使用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);
}