2014-03-19 48 views
1

我在我的視圖中有一個樹型查看器,它從標準Ecore編輯器收聽EMF模型,並用它做更多事情。我已經註冊了一個選擇監聽器,它將檢查所選元素是否是樹查看器需要的類型作爲輸入。所以問題是,如果模型中有任何變化(例如添加一個新的元素或新的信息到現有的元素等),只有當用戶改變選擇時,樹查看器才顯示改變的模型,即點擊任何模型元素等在底層模型更改之後更新JFace TreeViewer

但是我需要做的是,如果底層模型發生變化並顯示新模型元素,樹查看器會直接得到通知,而無需點擊模型來監聽它。

我發現了以下的eclipse角落文章(https://www.eclipse.org/articles/Article-TreeViewer/TreeViewerArticle.htm#inputChanged),並且從「響應變化」看來,inputChanged()和refresh()方法可能是我正在尋找的解決方案,不是嗎?

我仍然想知道是否有更簡單的方法可以做到這一點,而不必更改模型代碼,而只需更改UI代碼?謝謝!

回答

4

您可以調用TreeViewerrefresh()方法使其從模型刷新整個樹,或者從給定模型對象刷新樹。

如果樹結構沒有改變,你可以調用update(Object)來更新單個對象的顯示。

還有addremove方法用於從模型樹中添加和刪除對象。

某些方法也有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 
    } 
} 
+0

提取是的,我知道的這些方法和它們的功能。我已經多次使用它們。但是這裏的問題是我的樹型瀏覽器如何知道底層模型的變化,而不像使用選擇監聽器那樣顯式地監聽模型;所以它可以調用刷新方法等?我應該最有可能註冊一個監聽器模型,我的模型應該正確地實現inputChanged()方法,但是究竟如何以及哪一個?或者有沒有更好的方式而不更改模型代碼? – DanglingElse

+0

添加了現有用法的示例以及在哪裏設置模型偵聽器。 –

+0

感謝您的更新,但我仍然遇到一些困難。你能給我一些關於inputChanged()的用法和註冊IResourceChangeListener的代碼片段嗎?非常感謝! – DanglingElse