我們有以下場景: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對這個變化事件做出反應,但事實並非如此。
有沒有人有關於如何做到這一點的任何想法?
由於提前, 斯特芬
感謝您的迴應。 我們稍微改變了代碼並刪除了DataBindingContext。現在我們只用Ralf Ebert的TableBuilder構建列。 bindToProperty() - 方法正在做它的工作。 如果一個新的Item被添加到LogItemList中,我們觸發一個propertyChangeEvent並使用TableBuilder.setInput() - 方法將內容加載到表中。 乾杯,Steffen – Steffen 2013-03-20 16:44:58
一個很好的解決方案。可以使添加編輯支持變得困難... – 2013-03-21 09:13:47