2016-05-27 4 views
0

私は、グレーズリストを使って簡単なフィルタローを実装しようとしています。 filterrowが表示され、フィルタ文字列をテキストフィールドに配置できます。 それまではすべて正常に機能しますが、Enterキーを押すと何も起こりません。フィルタリングなし。私はまた、次の記事を読んで、[1] https://github.com/eclipse/nebula.widgets.nattable/blob/master/org.eclipse.nebula.widgets.nattable.examples/src/org/eclipse/nebula/widgets/nattable/examples/_600_GlazedLists/_603_Filter/_6031_GlazedListsFilterExample.javaNatTable:テーブルはフィルタリングで反応しません

は、ほとんど私が例に続く[2] http://www.eclipse.org/nattable/resources/NatTable_Advanced.pdf私の実装に今

[1] Iで説明したように

DataListをDataProviderに渡す前に、そのデータリストをfilterListにパックしました。その後、GlazedListsEventLayerでbodyLayerStackを構築しました。私はその内容を作成した後、テーブルを更新するため

EventList<T> eventList = GlazedLists.eventList(entries); 
    TransformedList<T, T> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList); 
    SortedList<T> sortedList = new SortedList<T>(rowObjectsGlazedList, null); 

    filterList = new FilterList<T>(sortedList); 

    bodyDataProvider = new LogListDataProvider<>(filterList, columnPropertyAccessor); 
    DataLayer bodyDataLayer = new DataLayer(getBodyDataProvider()); 
    GlazedListsEventLayer<T> glazedListsEventLayer = new GlazedListsEventLayer<T>(bodyDataLayer, filterList); 
    ColumnReorderLayer columnReorderLayer = new ColumnReorderLayer(glazedListsEventLayer); 
    ColumnHideShowLayer columnHideShowLayer = new ColumnHideShowLayer(columnReorderLayer); 
    selectionLayer = new SelectionLayer(columnHideShowLayer, false); 

    ViewportLayer viewportLayer = new ViewportLayer(getSelectionLayer()); 

使用するクラスは「LogListDataProvider」ListDataProviderに拡張子だけで、私は「セットリスト(一覧リスト)」セッター・メソッドを追加しました。私も例に従っFilterRowHeaderため

public class LogListDataProvider<T> extends ListDataProvider<T> { 

public LogListDataProvider(List<T> list, IColumnAccessor<T> columnAccessor) { 
    super(list, columnAccessor); 
} 

public void setList(List<T> list) { 
    this.list = list; 
} 

}

[1]とFilterRowHeaderCompositeを構築します。

FilterRowHeaderComposite<LogEntry> filterRowHeaderComposite = new FilterRowHeaderComposite<LogEntry>(
      new DefaultGlazedListsFilterStrategy<LogEntry>(bodyLayerStack.getFilterList(), 
        columnPropertyAccessor, configRegistry), 
        columnHeaderLayer, columnHeaderDataLayer.getDataProvider(), configRegistry); 

    // Columns: 1 ; Rows: 2 
    CompositeLayer compositeLayer = new CompositeLayer(1, 2); 
    compositeLayer.addConfiguration(new DefaultGridLayerConfiguration(compositeLayer)); 

    // add headerlayer-stack and bodylayer-stack to compositelayer 
    compositeLayer.setChildLayer(GridRegion.COLUMN_HEADER, filterRowHeaderComposite, 0, 0); 
    compositeLayer.setChildLayer(GridRegion.BODY, bodyLayerStack, 0, 1); 

私にとっては、[1] [2]を正しく実行したようですが、動作しません。

答えて

0

この問題は、setList()を使用してコンテンツを交換する方法のようです。フィルタロジックは、DefaultGlazedListsFilterStrategyの作成時に最初のリストにバインドされます。 setList()を使用してボディのコンテンツを交換しますが、フィルタは以前のリストでも動作します。

これらの事実のため、NatTableでデータを交換する典型的な方法は、元のリストに新しい内容をクリアして追加することです。ビッグデータセットの場合は、変更前にイベントレイヤを無効にしてから、再度有効にして、更新およびイベント処理に関する競合状態を回避する必要があります。

フィルタ戦略でリストを変更することもサポートされているかどうかはわかりません。それは別の選択肢かもしれない。しかし、それは他の条件のために動作するかどうかはわかりません。

+0

今すぐ動作します、ありがとうございます! –

+0

別の質問(少し話題ですが、私は大丈夫です) 実行時にフィルターのregisterConfigAttributeを変更することは可能ですか(正規表現の一致やコンボボックスなど)? –

+0

TextMatchingModeは実行時に決定されるため、可能である必要があります。 –

関連する問題