我们有以下场景:一个 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);
}
}
-MethodfirePropertyChange
继承自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 会对这个更改事件做出反应,但事实并非如此。
有人对如何做到这一点有任何想法吗?
在此先感谢,史蒂芬