【问题标题】:Body Layer not displaying correctly when using a FilterRowHeaderComposite使用 FilterRowHeaderComposite 时正文层无法正确显示
【发布时间】:2020-09-24 14:37:26
【问题描述】:

我的列有一个复合层来显示摘要标题和列标题。

如果我创建一个 FilterRowHeaderComposite 并替换复合层中的列层,它会正确显示过滤器,但不再显示任何正文层。如果我调整任何行的大小,它会显示这些行。

bodyLayer = new TableBodyLayer < > (rowDataProvider, tableConfig, tableData);
summaryColumnHeaderLayer = new TableSummaryColumnHeaderLayer(bodyLayer, summaryColumnHeaderProvider);
summaryRowHeaderLayer = new TableSummaryRowHeaderLayer(bodyLayer, summaryRowHeaderProvider);
rowHeaderLayer = new TableRowHeaderLayer(rowHeaderProvider, bodyLayer);
columnHeaderLayer = new TableColumnHeaderLayer(columnHeaderProvider, bodyLayer);

final IColumnAccessor < T > columnAccessor = new IColumnAccessor < > () {

    @Override
    public Object getDataValue(T rowObject, int columnIndex) {
        return result;
    }

    @Override
    public void setDataValue(T rowObject, int columnIndex, Object newValue) {}

    @Override
    public int getColumnCount() {
        return tableData.getColumnHeaders().size();
    }
};

final IFilterStrategy < T > filterStrategy = new DefaultGlazedListsFilterStrategy < > (tableData.getRows(),
    columnAccessor, configRegistry);

final FilterRowHeaderComposite < T > filterRowHeaderComposite = new FilterRowHeaderComposite < > (
    filterStrategy, columnHeaderLayer, rowDataProvider, configRegistry);

final CompositeLayer columnCompositeLayer = new CompositeLayer(1, 2);
columnCompositeLayer.setChildLayer(GridRegion.COLUMN_GROUP_HEADER, summaryColumnHeaderLayer, 0, 0);
columnCompositeLayer.setChildLayer(GridRegion.COLUMN_HEADER, filterRowHeaderComposite, 0, 1);

示例

无 FilterRowHeaderComposite

添加了FilterRowHeaderComposite

添加了 FilterRowHeaderComposite 的行大小调整

我已尝试使用过滤器列,它们已成功过滤出正确的行。

列标题层

public class TableColumnHeaderLayer extends AbstractLayerTransform {

private final ColumnHeaderLayer colHeaderLayer;

public TableColumnHeaderLayer(final IDataProvider dataProvider, final TableBodyLayer bodyLayerStack) {
    final DataLayer dataLayer = new DataLayer(dataProvider);

    colHeaderLayer = new ColumnHeaderLayer(dataLayer, bodyLayerStack,
        bodyLayerStack.getSelectionLayer());

    setUnderlyingLayer(colHeaderLayer);

    final IConfigLabelAccumulator columnCellLabelAccumilator = (configLabels,
        columnPosition, rowPosition) - > {
        // Some logic to add a label
        configLabels.addLabel(CustomLineBorderDecorator.RIGHT_LINE_BORDER_LABEL);
        configLabels.addLabel(CustomLineBorderDecorator.BOTTOM_LINE_BORDER_LABEL);
    };
    colHeaderLayer.setConfigLabelAccumulator(columnCellLabelAccumilator);

}

public ColumnHeaderLayer getColumnHeaderLayer() {
    return colHeaderLayer;
}}

正文页眉层

public class TableBodyLayer < T > extends AbstractLayerTransform {

@Nullable
private TableData < T > tableData = null;

private final SelectionLayer selectionLayer;
private final DataLayer bodyDataLayer;
private final GlazedListsEventLayer < T > eventLayer;

public TableBodyLayer(final RowDataProvider < T > rowDataProvider, final TableConfig tableConfig) {
    this(rowDataProvider, tableConfig, null);
}

public TableBodyLayer(final RowDataProvider < T > rowDataProvider, final TableConfig tableConfig,
    final TableData < T > tableData) {
    bodyDataLayer = new DataLayer(rowDataProvider);
    bodyDataLayer.setDefaultColumnWidth(MINIMUM_COLUMN_WIDTH);
    bodyDataLayer.setDefaultRowHeight(MINIMUM_ROW_HEIGHT);

    IUniqueIndexLayer completeLayer = bodyDataLayer;

    if (tableConfig.isColumnReorderingEnabled()) {
        completeLayer = new ColumnReorderLayer(bodyDataLayer);
    }

    if (tableConfig.isRowReorderingEnabled()) {
        completeLayer = new RowReorderLayer(completeLayer);
    }

    if (tableConfig.isColumnFilteringEnabled()) {
        eventLayer = new GlazedListsEventLayer < > (bodyDataLayer, tableData.getRows());
        completeLayer = eventLayer;
    } else {
        eventLayer = null;
    }

    selectionLayer = new SelectionLayer(completeLayer, false);

    if (tableConfig.isRowSelectionOnly()) {

        selectionLayer.setSelectionModel(
            new RowSelectionModel < > (selectionLayer, rowDataProvider, new IRowIdAccessor < T > () {

                @Override
                public Serializable getRowId(final T rowObject) {
                    return rowDataProvider.indexOfRowObject(rowObject);
                }
            }));
        selectionLayer.addConfiguration(new DefaultRowSelectionLayerConfiguration());
    }

    final AggregateConfiguration selectionLayerConfiguration = new SelectionLayerConfiguration();
    selectionLayer.addConfiguration(selectionLayerConfiguration);

    final ViewportLayer viewportLayer = new ViewportLayer(selectionLayer);

    setUnderlyingLayer(viewportLayer);
}

public SelectionLayer getSelectionLayer() {
    return selectionLayer;
}

public DataLayer getDataLayer() {
    return bodyDataLayer;
}

public void setTableData(final TableData < T > tableData) {
    this.tableData = tableData;
    if (eventLayer != null) {
        eventLayer.setEventList(tableData.getRows());
    }
}}

表格数据

public class TableData < T > {

private String xSummaryHeader;
private String ySummaryHeader;

/** Along the top */
private final List < ColumnHeader < T >> columnHeaders;

/** Along the side */
private DataGetter < T > rowHeaderGetter;

private final FilterList < T > rows = new FilterList < > (GlazedLists.eventList(Collections.emptyList()));

public TableData() {
    this(null, null, new ArrayList < > (), null, new ArrayList < > ());
}

public TableData(final List < ColumnHeader < T >> columnHeaders, final DataGetter < T > rowHeaderGetter,
    final List < T > rows) {

    this(null, null, columnHeaders, rowHeaderGetter, rows);
}

public TableData(final String xSummaryHeader, final String ySummaryHeader,
    final List < ColumnHeader < T >> columnHeaders, final DataGetter < T > rowHeaderGetter, final List < T > rows) {
    this.xSummaryHeader = xSummaryHeader;
    this.ySummaryHeader = ySummaryHeader;
    this.columnHeaders = columnHeaders;
    this.rowHeaderGetter = rowHeaderGetter;

    setRows(rows);
}

public String getColumnSummaryHeader() {
    return xSummaryHeader;
}

public String getRowSummaryHeader() {
    return ySummaryHeader;
}

public List < ColumnHeader < T >> getColumnHeaders() {
    return columnHeaders;
}

public DataGetter < T > getRowHeaderGetter() {
    return rowHeaderGetter;
}

public void setRowHeaderGetter(final DataGetter < T > rowHeaderGetter) {
    this.rowHeaderGetter = rowHeaderGetter;
}

public FilterList < T > getRows() {
    return rows;
}

public void setRows(final List < T > newRows) {
    final EventList < T > eventList = GlazedLists.eventList(newRows);
    final FilterList < T > filterList = new FilterList < > (eventList);
    rows.clear();
    rows.addAll(filterList);
}

public void setColumnSummaryHeader(final String xSummaryHeader) {
    this.xSummaryHeader = xSummaryHeader;
}

public void setRowSummaryHeader(final String ySummaryHeader) {
    this.ySummaryHeader = ySummaryHeader;
}}

正文层的行数据提供程序

public class RowDataProvider < T > implements IRowDataProvider < T > {

@Nullable
private TableData < T > tableData = null;

@Nullable
private TableCellLabelProvider cellLabelProvider = null;

@Override
public int getColumnCount() {
    if (tableData != null) {
        return tableData.getColumnHeaders().size();
    } else {
        return 0;
    }
}

@Override
public int getRowCount() {
    if (tableData != null) {
        return tableData.getRows().size();
    } else {
        return 0;
    }
}

@Override
public Object getDataValue(final int columnIndex, final int rowIndex) {
    // Get data code here
}

@Override
public void setDataValue(final int columnIndex, final int rowIndex, final Object newData) {
    // Set data code here        

}

public void setTableCellLabelProvider(final TableCellLabelProvider cellLabelProvider) {
    this.cellLabelProvider = cellLabelProvider;
}

@Override
public T getRowObject(final int rowIndex) {
    return tableData.getRows().get(rowIndex);
}

@Override
public int indexOfRowObject(T rowObject) {
    return tableData.getRows().indexOf(rowObject);
}

public TableData < T > getTableData() {
    return tableData;
}

public void setTableData(final TableData < T > tableData) {
    this.tableData = tableData;
}}

列标题提供程序

public class ColumnHeaderProvider < T > implements IDataProvider {

private List < ColumnHeader < T >> headers = null;

@Override
public int getColumnCount() {
    return headers.size();
}

@Override
public int getRowCount() {
    return 1;
}

@Override
public Object getDataValue(final int columnIndex, final int rowIndex) {
    if ((headers != null) && (headers.size() > columnIndex) && (columnIndex >= 0)) {
        return headers.get(columnIndex).getTitle();
    } else {
        return StringUtils.EMPTY;
    }
}

@Override
public void setDataValue(final int columnIndex, final int rowIndex, final Object newValue) {
    throw new UnsupportedOperationException();
}

public void setHeaders(final List < ColumnHeader < T >> headers) {
    this.headers = headers;
}}

缺少的配置

configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITOR, new FilterRowTextCellEditor(),
    DisplayMode.NORMAL, GridRegion.FILTER_ROW);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER,
    new PaddingDecorator(new TextPainter(), 0, 0, 0, 5), DisplayMode.NORMAL, GridRegion.FILTER_ROW);
configRegistry.registerConfigAttribute(CellConfigAttributes.RENDER_GRID_LINES, Boolean.TRUE, DisplayMode.NORMAL,
    GridRegion.FILTER_ROW);
configRegistry.registerConfigAttribute(EditConfigAttributes.CELL_EDITABLE_RULE, IEditableRule.ALWAYS_EDITABLE,
    DisplayMode.NORMAL, GridRegion.FILTER_ROW);
configRegistry.registerConfigAttribute(FilterRowConfigAttributes.TEXT_MATCHING_MODE, TextMatchingMode.CONTAINS);
configRegistry.registerConfigAttribute(FilterRowConfigAttributes.FILTER_DISPLAY_CONVERTER,
    new DefaultDisplayConverter());
configRegistry.registerConfigAttribute(FilterRowConfigAttributes.FILTER_COMPARATOR,
    DefaultComparator.getInstance());

【问题讨论】:

    标签: java nattable


    【解决方案1】:

    很难从您的 sn-p 中分辨出来,因为您为几乎每个默认 NatTable 图层创建了自定义图层。我不知道你在那里做了什么。

    我注意到的两件事是:

    1. 您为DefaultGlazedListsFilterStrategy 引入了一个新的列访问器,而不是使用与正文数据相同的列访问器。
    2. 您正在为 FilterRowHeaderComposite 使用正文数据提供程序,而不是列标题数据提供程序。

    【讨论】:

    • 身体数据提供者实现了IRowDataProvider,所以我不能使用它。我也应该实施IColumnAccessor 吗?
    • 我为图层添加了更多代码。让我知道是否有任何其他信息可能会有所帮助。
    • 就像我之前说的,很多问题。您是否实现了自定义IDataProvider?你在使用 GlazedLists 吗? TableData 是什么?您是否尝试过为FilterRowHeaderComposite 使用列标题数据提供程序?
    • TableData 对象仅用于在一个位置存储列标题、行和行标题获取器。让一切变得更整洁。 GlazedLists 用于 TableData 对象中的行。我已经添加了提供者和表格数据。
    • 对不起,我没有回答你的问题。我尝试使用列数据提供程序并得到相同的结果。
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多