java - NatTable 中的 RowSelection 与列组标题
问题描述
我创建了一个 Eclipse 应用程序,在其中我使用单个列标题为 NatTable 实现了行选择。行选择正常工作。后来我在应用程序中添加了一个带有列组标题的 NatTable。问题来了,单击单元格后,行选择不起作用。仅选择单击的单元格。
RowSelectionAction extends AbstractSelectionAction
我在类中定义行选择。RowSelectionAction
对象是在configureBodyMouseClickBindings()
类的重写方法中创建的extends DefaultSelectionBindings
。在方法期间调用此NatTable.configure()
方法。但似乎configureBodyMouseClickBindings()
在使用列分组标题创建的 NatTable 中没有调用方法。
以下是使用简单列标题创建 NatTable 的代码:
private NatTable createTable(Composite parent, List<TableLine> tLines, String[][] propertyNames,
PropertyToLabels[] propToLabels, TableParams params, TextMatcherEditor<TableLine>editor) {
BodyLayerStack bodyLayerStack =
new BodyLayerStack(
tLines,
new LineDataProviderColumnAccessor(propertyNames[0].length),
params.getColumnIndicesForRowHeaders());
DataLayer bodyDataLayer = bodyLayerStack.getBodyDataLayer();
Integer[] rowHeights = params.getRowHeights();
if( rowHeights != null && rowHeights.length > 0 ) {
for( int i = 0; i < rowHeights.length; i++ ) {
if( rowHeights[i] != null )
bodyDataLayer.setRowHeightByPosition(i, rowHeights[i]);
}
}
Integer[] colWidths = params.getColumnWidths();
if( colWidths != null && colWidths.length > 0 ) {
for( int i = 0; i < colWidths.length; i++ )
if( colWidths[i] != null )
bodyDataLayer.setColumnWidthByPosition(i, colWidths[i]);
}
IDataProvider columnHeaderDataProvider =
new DefaultColumnHeaderDataProvider(propertyNames[0], propToLabels[0].getPropertyToLabels());
DataLayer columnHeaderDataLayer =
new DefaultColumnHeaderDataLayer(columnHeaderDataProvider);
ILayer columnHeaderLayer =
new ColumnHeaderLayer(
columnHeaderDataLayer,
bodyLayerStack,
(SelectionLayer)null);
Integer[] hrHeights = params.getHeaderRowHeights();
if( hrHeights != null && hrHeights.length > 0 )
columnHeaderDataLayer.setRowHeightByPosition(0, hrHeights[0]);
CompositeLayer composite = new CompositeLayer(1, 2);
composite.setChildLayer(GridRegion.COLUMN_HEADER, columnHeaderLayer, 0, 0);
composite.setChildLayer(GridRegion.BODY, bodyLayerStack, 0, 1);
NatTable natTable = new NatTable(parent, composite, false);
natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
natTable.addConfiguration(new ContextMenuConfiguration(natTable));
natTable.addConfiguration(new AbstractRegistryConfiguration() {
@Override
public void configureRegistry(IConfigRegistry configRegistry) {
Style cellStyle = new Style();
cellStyle.setAttributeValue(
CellStyleAttributes.BACKGROUND_COLOR,
GUIHelper.COLOR_WIDGET_BACKGROUND);
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_STYLE, cellStyle,
DisplayMode.NORMAL, RowHeaderLabel);
}
});
natTable.configure();
editor.setFilterator(new TextFilterator<TableLine>() {
@Override
public void getFilterStrings(List<String> baseList, TableLine element) {
for( int i = 0; i < element.getLength(); i++ )
baseList.add("" + element.getObjectByColumn(i));
}
});
editor.setMode(TextMatcherEditor.REGULAR_EXPRESSION);
bodyLayerStack.getFilterList().setMatcherEditor(editor);
return natTable;}
BodyLayerStack.class 内容:
class BodyLayerStack extends AbstractLayerTransform {
private final FilterList<TableLine> filterList;
private final SelectionLayer selectionLayer;
private final DataLayer bodyDataLayer;
private final IRowDataProvider<TableLine> bodyDataProvider;
public DataLayer getBodyDataLayer() {
return bodyDataLayer;
}
public SelectionLayer getSelectionLayer() {
return selectionLayer;
}
public IRowDataProvider<TableLine> getBodyDataProvider() {
return bodyDataProvider;
}
public BodyLayerStack(List<TableLine> values, IColumnAccessor<TableLine> columnAccessor, Integer[] columnIndicesForRowHeaders) {
EventList<TableLine> eventList = GlazedLists.eventList(values);
TransformedList<TableLine, TableLine> rowObjectsGlazedList = GlazedLists.threadSafeList(eventList);
this.filterList = new FilterList<>(rowObjectsGlazedList);
this.bodyDataProvider = new ListDataProvider<TableLine>(this.filterList, columnAccessor);
bodyDataLayer = new DataLayer(this.bodyDataProvider);
ColumnOverrideLabelAccumulator bodyLabelAccumulator = new ColumnOverrideLabelAccumulator(bodyDataLayer);
bodyDataLayer.setConfigLabelAccumulator(bodyLabelAccumulator);
if( columnIndicesForRowHeaders != null ) {
for ( int i = 0; i < columnIndicesForRowHeaders.length; i++ ) {
bodyLabelAccumulator.registerColumnOverrides(
columnIndicesForRowHeaders[i],
RowHeaderLabel);
}
}
GlazedListsEventLayer<TableLine> glazedListsEventLayer =
new GlazedListsEventLayer<>(bodyDataLayer, this.filterList);
this.selectionLayer = new SelectionLayer(glazedListsEventLayer, false);
selectionLayer.setSelectionModel(new RowSelectionModel<TableLine>(selectionLayer, this.bodyDataProvider, new IRowIdAccessor<TableLine>()
{
@Override
public Serializable getRowId(TableLine line)
{
return line.getId();
}
}));
selectionLayer.addConfiguration(new DefaultSelectionLayerConfiguration()
{
@Override
protected void addSelectionUIBindings()
{
addConfiguration(new SelectionBindings());
}
@SuppressWarnings("rawtypes")
@Override
protected void addMoveSelectionConfig()
{
addConfiguration(new RowOnlySelectionConfiguration());
}
});
ViewportLayer viewportLayer = new ViewportLayer(selectionLayer);
setUnderlyingLayer(viewportLayer);
}
public FilterList<TableLine> getFilterList() {
return this.filterList;
}
}
这是创建列组标题 NatTable 的代码:
private NatTable createTableWithColumnHeaderGroups(Composite parent, List<TableLine> tLines, TableParams params,
TextMatcherEditor<TableLine> editor) {
String[][] columnHeaders = params.getColumnHeaders();
if( columnHeaders == null || columnHeaders.length != 2 )
return null;
String[] propertyNames = new String[columnHeaders[1].length];
PropertyToLabels propToLabels = new PropertyToLabels();
for( int i = 0; i < propertyNames.length; i++ ) {
propertyNames[i] = String.valueOf(i+1) + "_" + columnHeaders[1][i];
propToLabels.add(propertyNames[i], columnHeaders[1][i]);
}
BodyLayerStack bodyLayerStack =
new BodyLayerStack(
tLines,
new LineDataProviderColumnAccessor(propertyNames.length),
params.getColumnIndicesForRowHeaders());
ColumnGroupModel columnGroupModel = new ColumnGroupModel();
IRowDataProvider<TableLine> bodyDataProvider =
new ListDataProvider<TableLine>(tLines, new LineDataProviderColumnAccessor(propertyNames.length));
ColumnGroupBodyLayerStack bodyLayer =
new ColumnGroupBodyLayerStack(bodyLayerStack.getBodyDataLayer(), columnGroupModel);
Integer[] rowHeights = params.getRowHeights();
if( rowHeights != null && rowHeights.length > 0 ) {
for( int i = 0; i < rowHeights.length; i++ ) {
if( rowHeights[i] != null )
bodyLayer.doCommand(new RowResizeCommand(bodyLayer, i, rowHeights[i]));
}
}
Integer[] colWidths = params.getColumnWidths();
if( colWidths != null && colWidths.length > 0 ) {
for( int i = 0; i < colWidths.length; i++ )
if( colWidths[i] != null )
bodyLayer.doCommand(new ColumnResizeCommand(bodyLayer, i, colWidths[i]));
}
// Column header
DefaultColumnHeaderDataProvider defaultColumnHeaderDataProvider =
new DefaultColumnHeaderDataProvider(propertyNames, propToLabels.getPropertyToLabels());
DefaultColumnHeaderDataLayer columnHeaderDataLayer =
new DefaultColumnHeaderDataLayer(defaultColumnHeaderDataProvider);
ColumnHeaderLayer columnHeaderLayer =
new ColumnHeaderLayer(columnHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer());
ColumnGroupHeaderLayer columnGroupHeaderLayer =
new ColumnGroupHeaderLayer(
columnHeaderLayer,
bodyLayer.getSelectionLayer(),
columnGroupModel);
Integer[] hrHeights = params.getHeaderRowHeights();
if( hrHeights != null && hrHeights.length > 0 )
for( int i = 0; i < hrHeights.length; i++ )
if( hrHeights[i] != null )
columnGroupHeaderLayer.doCommand(new RowResizeCommand(columnGroupHeaderLayer, i, hrHeights[i]));
List<ColumnHeaderGroup> groups = params.getColumnHeaderGroups();
for( ColumnHeaderGroup group : groups ) {
List<Integer> indices = group.getIndices();
int[] indicesArray = new int[indices.size()];
for( int i = 0; i < indices.size(); i++ )
indicesArray[i] = indices.get(i);
columnGroupHeaderLayer.addColumnsIndexesToGroup(group.getName(), indicesArray);
}
// Row header
final DefaultRowHeaderDataProvider rowHeaderDataProvider =
new DefaultRowHeaderDataProvider(bodyDataProvider);
DefaultRowHeaderDataLayer rowHeaderDataLayer =
new DefaultRowHeaderDataLayer(rowHeaderDataProvider);
ILayer rowHeaderLayer =
new RowHeaderLayer(rowHeaderDataLayer, bodyLayer, bodyLayer.getSelectionLayer());
// Corner
final DefaultCornerDataProvider cornerDataProvider =
new DefaultCornerDataProvider(defaultColumnHeaderDataProvider, rowHeaderDataProvider);
DataLayer cornerDataLayer =
new DataLayer(cornerDataProvider);
ILayer cornerLayer =
new CornerLayer(cornerDataLayer, rowHeaderLayer, columnGroupHeaderLayer);
// Grid
GridLayer gridLayer =
new GridLayer(bodyLayer, columnGroupHeaderLayer, rowHeaderLayer, cornerLayer);
NatTable natTable = new NatTable(parent, gridLayer, false);
editor.setFilterator(new TextFilterator<TableLine>() {
@Override
public void getFilterStrings(List<String> baseList, TableLine element) {
for( int i = 0; i < element.getLength(); i++ )
baseList.add("" + element.getObjectByColumn(i));
}
});
editor.setMode(TextMatcherEditor.REGULAR_EXPRESSION);
bodyLayerStack.getFilterList().setMatcherEditor(editor);
natTable.addConfiguration(new DefaultNatTableStyleConfiguration());
natTable.addConfiguration(new ContextMenuConfiguration(natTable));
natTable.addConfiguration(new AbstractRegistryConfiguration() {
@Override
public void configureRegistry(IConfigRegistry configRegistry) {
Style cellStyle = new Style();
cellStyle.setAttributeValue(
CellStyleAttributes.BACKGROUND_COLOR,
GUIHelper.COLOR_WIDGET_BACKGROUND);
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL_STYLE, cellStyle,
DisplayMode.NORMAL, RowHeaderLabel);
}
});
natTable.configure();
return natTable; }
最终,问题可能出在 nat 表的 nat 表层实现中,并创建了两行列标题。
解决方案
问题出在您的代码中。在ColumnGroupHeader
您创建两个主体层堆栈的版本中。首先BodyLayerStack
,您也显示。但是那个不与列组示例一起使用。在那里你使用第二个名为ColumnGroupBodyLayerStack
. 由于未显示该类,因此我无法判断该类是否缺少行选择配置。但可能是这样,因为在 NatTable 层实现中没有关于该功能的问题。
顺便说一句,我建议使用 NatTable 1.6 引入的性能列分组,而不是基于旧ColumnGroupModel
的实现。
推荐阅读
- javascript - 如何在javascript中将escpaed unicode转换为表情符号?
- elasticsearch - 无法使用 elasticsearch 和 metricbeat 检索标准化 CPU 利用率百分比
- c# - 'JsonPropertyAttribute' 由于其保护级别而无法访问
- python - 如何使用单行标题(5k 列)将数据帧写入 csv?
- asp.net-mvc - 如何为查询字符串中的 sting 参数提供日期格式?
- apache-spark - 跨多个 Spark 作业重用 Spark 会话
- tensorflow - 检查 TensorFlow 是否在 GPU 上运行
- python - 根据熊猫数据框另一列的值填充空值
- alexa - 技能完成时的简单确认
- java - 在 Java Batch 中从阅读器获取属性