У нас есть следующий сценарий: RCP-приложение Eclipse 4 должно записать вывод журнала. Эти журналы связаны через 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
-Метод унаследован от 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 реагирует на это событие изменения, но это не так.
У кого-нибудь есть идеи, как это сделать правильно?
Заранее спасибо, Стеффен