我们有以下情形:Eclipse 4 RCP-Application应该编写日志输出。这些日志通过OSGi-Service绑定,应使用JFace TableViewer显示。

对于此ViewPart的首次启动,此方法效果很好。 (因为已经有日志)如果视图启动后另一个插件写入日志,则该视图也应更新。包含视图日志的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 -Method继承自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对这个变更事件有反应,但事实并非如此。

有人对此有任何想法吗?

提前致谢,
斯特芬

最佳答案

WritableList不会自动监视列表。 (为什么List没有通知界面?)

最简单的方法是用LogItemList.items而不是WriteableList来实现ArrayList。不利的一面是,核心模型并不像它本来应该那样干净。

或者,您可以向LogItemList添加一个侦听器,该侦听器传播到WritableList.fireListChanged(...)。也许是一个“更清洁”的解决方案,但是需要更多的工作,因为您需要将“ WritableList”子类化。

或者,您可以根据EMF实现核心模型并使用EMFObservables.observeList(...)。还有更多工作,但实际上,我会做的:-)

10-04 13:02