您可以調用TreeViewer
refresh()
方法使其從模型刷新整個樹,或者從給定模型對象刷新樹。
如果樹結構沒有改變,你可以調用update(Object)
來更新單個對象的顯示。
還有add
和remove
方法用於從模型樹中添加和刪除對象。
某些方法也有Object []
變體,因此您可以一次修改多個對象。
更新:
你的模型應該支持生成模型改變事件,內容提供商可以聽。您可以在內容提供商inputChanged
方法中設置此偵聽器,並在dispose
方法中將其刪除。收到模型更改事件時,請使用各種方法更新樹。
所有這些都是如何使用的例子是顯示工作區中文件的Eclipse視圖(例如Navigator視圖)。這些內容提供者使用工作區資源更改偵聽器(IResourceChangeListener)來通知對工作區的更改,並使用事件中的信息調用上面列出的用於更新樹的方法。
更新2: 一個在內容提供商使用IResourceChangeListener
的例子,從org.eclipse.ui.views.tasklist.TaskListContentProvider
class TaskListContentProvider
implements IStructuredContentProvider, IResourceChangeListener
{
private TableViewer viewer;
private IResource input;
... other methods ....
public void dispose() {
if (input != null) {
input.getWorkspace().removeResourceChangeListener(this);
input = null;
}
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (input != null) {
input.getWorkspace().removeResourceChangeListener(this);
}
input = (IResource) newInput;
if (input != null) {
input.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
viewer = (TableViewer) viewer;
}
public void resourceChanged(IResourceChangeEvent event) {
... use resource change event to update viewer
}
}
提取是的,我知道的這些方法和它們的功能。我已經多次使用它們。但是這裏的問題是我的樹型瀏覽器如何知道底層模型的變化,而不像使用選擇監聽器那樣顯式地監聽模型;所以它可以調用刷新方法等?我應該最有可能註冊一個監聽器模型,我的模型應該正確地實現inputChanged()方法,但是究竟如何以及哪一個?或者有沒有更好的方式而不更改模型代碼? – DanglingElse
添加了現有用法的示例以及在哪裏設置模型偵聽器。 –
感謝您的更新,但我仍然遇到一些困難。你能給我一些關於inputChanged()的用法和註冊IResourceChangeListener的代碼片段嗎?非常感謝! – DanglingElse