次のシナリオがあります。Eclipse 4 RCP アプリケーションはログ出力を書き込む必要があります。これらのログは 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 は -class から継承されます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 はこの変更イベントに反応すると思っていましたが、そうではありません。
これを正しく行う方法について誰かアイデアがありますか?
前もってありがとう、ステフェン