【发布时间】: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());
【问题讨论】: