2013-03-01 70 views
0

我們有以下場景:Eclipse 4 RCP-應用程序應寫入日誌輸出。這些日誌通過OSGi-Service綁定,並且應該使用JFace TableViewer顯示。JFace TableViewer應對更改列表做出反應

這適用於此ViewPart的第一次啓動。 (因爲已經有日誌)如果另一個Plugin在View開始後寫入日誌,那麼這個視圖也應該被更新。包含視圖的日誌(作爲模型的一部分)的ArrayList被正確更新。

的表被設置是這樣的:

@PostConstruct 

public void createControls(Composite parent) { 
    b = new TableViewerBuilder(parent); 
    b.createColumn("Datum").bindToProperty("time").build(); 
    b.createColumn("Message").bindToProperty("message").build(); 
    b.createColumn("Level").bindToProperty("level").build(); 
    b.createColumn("Bundle").bindToProperty("bundle").build(); 
    m_bindingContext = initDataBindings(); 
} 

的綁定是由這種方式:

protected DataBindingContext initDataBindings() { 
    DataBindingContext bindingContext = new DataBindingContext(); 
    input = new WritableList(logItemList.getItems(), LogItem.class); 
    ViewerSupport.bind(tableViewer, input, BeanProperties 
     .values(new String[] { "time", "message", "level" })); 
    return bindingContext; 

}

我們從列表中的項目(這是正確更新)並將它們放入一個WritableList。該列表綁定到TableViewer並顯示時間戳,消息和某種類型的日誌級別。

的LogItemList是設置是這樣的:

public class LogItemList extends ModelObject { 
    [.. stuff ..] 
    private List<LogItem> items; 

    public List<LogItem> getItems() { 
     return items; 
    } 
    public void addItem(LoggingItem item) { 
     LogItem logItem = new LogItem(item); 
     List<LogItem> tmp = items; 
     items.add(logItem); 

     firePropertyChange("items", tmp, items); 
    } 
} 

firePropertyChange - 方法從ModelObject -class繼承。

public class ModelObject { 
     private PropertyChangeSupport changeSupport = 
      new PropertyChangeSupport(this); 
     protected void firePropertyChange(String propertyName, 
      Object oldValue, 
      Object newValue) { 
      changeSupport.firePropertyChange(propertyName, oldValue, newValue); 
    } 

我認爲TableViewer/Databinding對這個變化事件做出反應,但事實並非如此。

有沒有人有關於如何做到這一點的任何想法?

由於提前, 斯特芬

回答

1

WritableList不會自動監控名單。 (怎樣才能作爲List沒有通知界面?)

最簡單的辦法就是實行LogItemList.itemsWriteableList而不是ArrayList。缺點是核心模式並不像它本來可以/應該那樣乾淨。

或者,您可以將偵聽程序添加到LogItemList,該偵聽程序傳播到WritableList.fireListChanged(...)。也許是一個「更清潔」的解決方案,但需要更多的工作,因爲你需要子類'WritableList`。

或者您可以使用EMF實現核心模型並使用EMFObservables.observeList(...)。方式更多的工作,但實際上,我會做到這一點:-)

+0

感謝您的迴應。 我們稍微改變了代碼並刪除了DataBindingContext。現在我們只用Ralf Ebert的TableBuilder構建列。 bindToProperty() - 方法正在做它的工作。 如果一個新的Item被添加到LogItemList中,我們觸發一個propertyChangeEvent並使用TableBuilder.setInput() - 方法將內容加載到表中。 乾杯,Steffen – Steffen 2013-03-20 16:44:58

+0

一個很好的解決方案。可以使添加編輯支持變得困難... – 2013-03-21 09:13:47