Java 列组标题的NatTable中的行选择
我创建了一个Eclipse应用程序,在该应用程序中,我使用一个列标题实现了NatTable的行选择。行选择工作正常。后来,我在应用程序中添加了一个带有列组头的NatTable。问题来了,单击单元格后,行选择不起作用。仅选择单击的单元格 我在Java 列组标题的NatTable中的行选择,java,eclipse,nattable,Java,Eclipse,Nattable,我创建了一个Eclipse应用程序,在该应用程序中,我使用一个列标题实现了NatTable的行选择。行选择工作正常。后来,我在应用程序中添加了一个带有列组头的NatTable。问题来了,单击单元格后,行选择不起作用。仅选择单击的单元格 我在RowSelectionAction扩展了AbstractSelectionAction类中定义行选择RowSelectionAction对象是在类的重写configureBodyMouseClickBindings()方法中创建的扩展了DefaultSele
RowSelectionAction扩展了AbstractSelectionAction
类中定义行选择RowSelectionAction
对象是在类的重写configureBodyMouseClickBindings()
方法中创建的扩展了DefaultSelectionBindings
。在NatTable.configure()过程中调用此方法。但似乎在使用列groupd头创建的NatTable上没有调用configureBodyMouseClickBindings()
方法
下面是创建具有简单列标题的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;}
private-NatTable-createTable(复合父级、列表行、字符串[][]属性名称、,
PropertyToLabels[]propToLabels,TableParams params,TextMatcherEditor){
BodyLayerStack BodyLayerStack=
新BodyLayerStack(
T线,
新的LineDataProviderColumnAccessor(propertyNames[0].length),
params.getColumnIndicatesForRowHeaders());
DataLayer bodyDataLayer=bodyLayerStack.getBodyDataLayer();
整数[]行高=params.getRowHeights();
如果(rowHeights!=null&&rowHeights.length>0){
对于(int i=0;i0){
for(int i=0;i0)
columnHeaderDataLayer.setRowHeightByPosition(0,hrHeights[0]);
复合层复合=新复合层(1,2);
setChildLayer(GridRegion.COLUMN_头,columnHeaderLayer,0,0);
复合.setChildLayer(GridRegion.BODY,bodyLayerStack,0,1);
NatTable NatTable=新的NatTable(父项、复合项、false);
addConfiguration(新的DefaultNatTableStyleConfiguration());
addConfiguration(新的ContextMenuConfiguration(natTable));
addConfiguration(新的AbstractRegistryConfiguration(){
@凌驾
公共无效配置注册表(IConfigRegistry configRegistry){
Style cellStyle=新样式();
cellStyle.setAttributeValue(
CellStyleAttributes.BACKGROUND\u颜色,
GUIHelper.COLOR\u WIDGET\u BACKGROUND);
configRegistry.registerConfigAttribute(
CellConfigAttributes.CELL\u样式,cellStyle,
DisplayMode.NORMAL,RowHeaderLabel);
}
});
configure();
editor.setFilterator(新的TextFilterator(){
@凌驾
public void getFilterString(列表基本列表、TableLine元素){
对于(int i=0;i
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;
}
类BodyLayerStack扩展了AbstractLayerTransform{
私人最终筛选列表筛选列表;
私有最终选择层选择层;
私有最终数据层bodyDataLayer;
私有最终IRowDataProvider bodyDataProvider;
公共数据层getBodyDataLayer(){
返回数据层;
}
public SelectionLayer getSelectionLayer(){
返回selectionLayer;
}
公共IRowDataProvider getBodyDataProvider(){
返回bodyDataProvider;
}
public BodyLayerStack(列表值、IColumnAccessor columnAccessor、整型[]列表示行标题){
EventList EventList=glazedList.EventList(值);
TransformedList rowObjectsGlazedList=GlazedList.threadSafeList(事件列表);
this.filterList=新过滤器列表(rowObjectsGlazedList);
this.bodyDataProvider=新的ListDataProvider(this.filterList,columnAccessor);
bodyDataLayer=新数据层(this.bodyDataProvider);
ColumnOverrideLabelAccumulator bodyLabelAccumulator=新ColumnOverrideLabelAccumulator(bodyDataLayer);
bodyDataLayer.setConfigLabelAccumulator(bodyLabelAccumulator);
if(ColumnIndicatesForRowHeader!=null){
for(int i=0;iprivate 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; }