2016-11-23 14 views
0

をソート私は最初は私のテーブルには、ゼロ行があり http://www.eclipse.org/nattable/documentation.php?page=sorting と例 NatTable - 奇妙な行動

6031_GlazedListsFilterExample.java

のオフに基づいて並べ替え/フィルタ機能を持つnattableを持っています。

シナリオ1:

  • ノー行でNatTableが含まれているCTabItemを表示します。
  • それから、行を移入して列見出しをクリックすると、何も起こりません(並べ替えが無効になっているようです)。

シナリオ2:

  • ノー行でNatTableが含まれているCTabItemを表示しません。
  • 次に、行を設定します。
  • 次に、現在行があるNatTableを含むCTabItemを表示します。ノー行でNatTableが含まれているCTabItemを見たりしないでください

    • :予想通り、私は(ソートが有効になっているようだ)列ヘッダー、すべての種類に

    シナリオ3をクリックし

  • 次に、行を設定します。
  • 次に、現在行があるNatTableを含むCTabItemを表示します。
  • その後、すべての行データを削除します
  • 私は列見出しをクリックすると、すべてのソートが期待通りに行われます(並べ替えが有効になっているようです)。 *行がなくても列ヘッダーセルに上/下アイコンが表示されます

NatTableの最初の「ビュー」の後に列ヘッダーアクションが「更新」されないのはなぜですか?言い換えれば、NatTableが最初に表示された後の行の変化にかかわらず、残りのテーブルの寿命について、行の有無が考慮されるようです。

関連するコードセクションは、以下に示す:

private CompositeLayer createExampleLayer(Collection<T> values, 
    IColumnPropertyAccessor<T> columnPropertyAccessor, 
    IDataProvider columnHeaderDataProvider, IConfigRegistry 
    configRegistry, Matcher<T> matcher) { 
    BodyLayerStack<T> bodyLayerStack = new BodyLayerStack<>(
     values, columnPropertyAccessor); 

    // build the column header layer 
    DataLayer columnHeaderDataLayer = new 
     DefaultColumnHeaderDataLayer(columnHeaderDataProvider); 
    ILayer columnHeaderLayer = new 
     ColumnHeaderLayer(columnHeaderDataLayer, bodyLayerStack, 
     bodyLayerStack.getSelectionLayer()); 

    SortHeaderLayer<T> sortHeaderLayer = new SortHeaderLayer<> 
     (columnHeaderLayer, new GlazedListsSortModel<T> 
     (bodyLayerStack.getSortedList(), columnPropertyAccessor, 
     configRegistry,      
     bodyLayerStack.getBodyDataLayer()), false); 

    FilterRowHeaderComposite<T> filterRowHeaderLayer = new 
     FilterRowHeaderComposite<>(
     new DefaultGlazedListsFilterStrategy<T> 
     (bodyLayerStack.getFilterList(), columnPropertyAccessor, 
     configRegistry), 
     sortHeaderLayer, columnHeaderDataLayer.getDataProvider(), 
     configRegistry); 

    // Omitted code for rowHeaderLayer and cornerLayer 
    return new GridLayer(bodyLayerStack, filterRowHeaderLayer, 
    rowHeaderLayer, cornerLayer); 
} 

public BodyLayerStack(Collection<T> values, 
    IColumnPropertyAccessor<T> columnPropertyAccessor) { 
    eventList = GlazedLists.eventList(values); 

    TransformedList<T, T> rowObjectsGlazedList = 
     GlazedLists.threadSafeList(eventList); 

    this.sortedList = new SortedList<>(rowObjectsGlazedList, null); 

    // wrap the SortedList with the FilterList 
    this.filterList = new FilterList<>(sortedList); 
    this.bodyDataProvider = new ListDataProvider<>(this.filterList, 
     columnPropertyAccessor); 
    this.bodyDataLayer = new DataLayer(getBodyDataProvider()); 

    // layer for event handling of GlazedLists and PropertyChanges 
    GlazedListsEventLayer<T> glazedListsEventLayer = new 
     GlazedListsEventLayer<>(bodyDataLayer, this.filterList); 

    this.selectionLayer = new SelectionLayer(glazedListsEventLayer); 
    ViewportLayer viewportLayer = new ViewportLayer(getSelectionLayer()); 

    setUnderlyingLayer(viewportLayer); 
} 

private void enableSorting() { 
    this.nattable.addConfiguration(new SingleClickSortConfiguration()); 
} 
+0

どのようにデータを入力しますか? –

+0

eventListをロックし、それを直接に追加してください – ekjcfn3902039

+0

そして初期値リストは何ですか?空のリストまたはnull? –

答えて

1

はあなたのSortHeaderLayerの作成のように見える正しくありません。 GlazedListsSortModelの最後のパラメーターは、本文ヘッダーではなく、IDataLayerである必要があります。

コードを次のように変更すると、問題なく動作するはずです。それは少なくとも私の側で行った。

SortHeaderLayer<T> sortHeaderLayer = new SortHeaderLayer<> 
    (columnHeaderLayer, new GlazedListsSortModel<T> 
    (bodyLayerStack.getSortedList(), columnPropertyAccessor, 
    configRegistry,      
    columnHeaderDataLayer), false); 
+0

あなたは男です! :)それはそれだった。あなたの助けをありがとう! – ekjcfn3902039