gpt4 book ai didi

java - JFace TableViewer 应该对更改的列表使用react

转载 作者:行者123 更新时间:2023-12-01 14:48:20 24 4
gpt4 key购买 nike

我们有以下场景:Eclipse 4 RCP 应用程序应该写入日志输出。这些日志通过 OSGi-Service 绑定(bind),并应使用 JFace TableViewer 显示。

这对于该 ViewPart 的第一次启动非常有效。 (因为已经有日志)如果 View 启动后另一个插件写入日志,则该 View 也应该更新。包含 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();
}

数据绑定(bind)是这样进行的:

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 中。该列表绑定(bind)到 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-类。

    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 会对这个更改事件使用react,但事实并非如此。

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

提前致谢,史蒂芬

最佳答案

WritableList 不会自动监视列表。 (List怎么可能没有通知接口(interface)呢?)

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

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

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

关于java - JFace TableViewer 应该对更改的列表使用react,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15160182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com