【问题标题】:JFace TableViewer should react on changing listJFace TableViewer 应该对更改列表做出反应
【发布时间】:2013-03-01 14:33:35
【问题描述】:

我们有以下场景:Eclipse 4 RCP-Application 应该写一个日志输出。这些日志通过 OSGi 服务绑定,应使用 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 会对这个更改事件做出反应,但它没有。

有人对如何正确执行此操作有任何想法吗?

提前致谢, 史蒂芬

【问题讨论】:

    标签: java data-binding eclipse-rcp jface tableviewer


    【解决方案1】:

    WritableList 不会自动监控列表。 (List怎么可能没有通知界面?)

    最简单的方法是使用WriteableList 而不是ArrayList 来实现LogItemList.items。缺点是核心模型没有它可以/应该的那样干净。

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

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

    【讨论】:

    • 感谢您的回复。我们稍微更改了代码并删除了 DataBindingContext。现在我们只需使用 Ralf Ebert 的 TableBuilder 构建列。 bindToProperty()-方法正在做它的工作。如果将新项目添加到 LogItemList 中,我们会触发 propertyChangeEvent 并使用 TableBuilder.setInput() 方法将内容加载到表中。干杯,史蒂芬
    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    相关资源
    最近更新 更多