0

次のシナリオがあります。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 はこの変更イベントに反応すると思っていましたが、そうではありません。

これを正しく行う方法について誰かアイデアがありますか?

前もってありがとう、ステフェン

4

1 に答える 1

2

WritableListリストを自動的に監視しません。List(通知インターフェイスがないのにどうすればいいですか?)

最も簡単な方法は、代わりにLogItemList.itemswithを実装することです。欠点は、コア モデルが本来あるべき/可能な限りクリーンではないことです。WriteableListArrayList

LogItemListまたは、に伝播するリスナーを に追加することもできますWritableList.fireListChanged(...)。おそらく「よりクリーンな」ソリューションですが、「WritableList」をサブクラス化する必要があるため、もう少し作業が必要です。

または、EMF と use の観点からコア モデルを実装することもできますEMFObservables.observeList(...)。はるかに多くの作業ですが、実際には、私はそれをやったでしょう:-)

于 2013-03-04T09:51:29.333 に答える