2013-04-19 63 views
4

我試圖做一些看起來應該很常見的事情,所以我很驚訝我很難找到解決方案。當編輯器數據被修改時,Eclipse RCP視圖不會更新

我有一個簡單的Eclipse RCP應用程序。它由一個視圖組成,其中包含一個可以分層顯示xml文件元素的treeViewer。另一面是一個編輯器,它包含各種字段,如文本框等,用於顯示和修改xml值。 treeviewer在元素名稱旁邊顯示圖標,我試圖做的是在編輯器中進行更改時將圖標更改爲圖標的「修改」版本 - 表示該元素的值已更改。這與Eclipse與Subversion集成的方式非常相似,它顯示文件已從Package Explorer中的基本版本修改過。

我會盡量只顯示與這個特定問題相關的代碼部分,並希望我不會遺漏任何東西。這是編輯器類:

public class XmlEditor extends EditorPart 
{ 
    protected boolean dirty = false; 

    public void setDirty(boolean value) 
    { 
     dirty = value; 
     firePropertyChange(PROP_DIRTY); 
    } 
} 

,這是樹中的觀點:

public class TreeView extends ViewPart implements IPropertyChangeListener { 
    public void createPartControl(Composite parent) { 
     treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); 
     getSite().setSelectionProvider(treeViewer); 

     treeViewer.setLabelProvider(new TreeObjLabelProvider()); 
     treeViewer.setContentProvider(new TreeObjContentProvider()); 

     PlatformUI.getWorkbench().getWorkingSetManager().addPropertyChangeListener(this); 
    } 

    public void propertyChange(PropertyChangeEvent event) { 
     if (event.getProperty().equals(IWorkbenchPartConstants.PROP_DIRTY)) { 
      treeViewer.refresh(); 
     } 
    } 
} 

在這種情況下,TreeView::propertyChange()是沒有得到所謂的,即使是firePropertyChange()被解僱。任何想法爲什麼?我也接受任何不涉及PropertyChangeListener的其他想法,它似乎是當時最簡單的方法。謝謝。

回答

4

以下是我結束瞭解決問題:

  1. 更改TreeView控件來實現IPropertyListener,而不是IPropertyChangeListener
  2. 實現的propertyChanged()方法執行treeViewer.refresh()
  3. XmlEditor::createPartControl()方法中,我得到了Treeview部分的引用,然後將其添加到屬性偵聽器,如下所示:
    • addPropertyListener(treeView);

現在,TreeView::propertyChanged()firePropertyChanged()後調用,就像我需要的。需要進行相當多的實驗來了解IPropertyListenerIPropertyChangeListener,addPropertyListener()addPartPropertyListener()之間的差異。

感謝nitind給我一個新的視角,並向我展示了裝飾者,這絕對是正確的方式,而不是將樹圖標更改爲修改版本。

0

您在編輯器部分中觸發了與工作集管理器無關的屬性更改。您所做的任何事情都不會將視圖連接到編輯器。如果你想讓他們彼此交談,寫下他們互相交談,或者至少創建並對你所描述的修改進行反應。

我也很確定這不是SVN如何顯示文件已被修改。 SVN可能是提供一個裝飾:http://eclipse.org/articles/Article-Decorators/decorators.html

+0

如果這是一個選擇的情況下,很容易上鉤的編輯和查看在一起,因爲你可以指定PARTID在.addSelectionListener()調用的第一個參數。出於某種原因,該選項對於.addPropertyChangeListener()函數不存在,唯一的參數是針對偵聽器本身。我之所以這樣想,可能是一個PropertyChangeEvent被觸發時,可能會被註冊自己的應用程序中的任何監聽器聽到。這似乎並非如此。那麼你如何建議視圖被寫入正確地聽這個propertyChange? – JasonK

+0

對於這種更新,屬性更改太大。你想要更細粒度的東西,那就意味着要自己設置它。 – nitind

+0

爲什麼房產更改「太大」?我願意接受其他關於如何實現這一點的建議。如果你有更好的想法,我會非常欣賞一個例子。 – JasonK

0

添加這串代碼在你創建部分控制這將可能是幫助你

ResourcesPlugin.getWorkspace().addResourceChangeListener(new IResourceChangeListener() { 

     @Override 
     public void resourceChanged(IResourceChangeEvent event) { 
      treeViewer.refresh(); 
     } 
    }); 
相關問題