Eclipse rcp 使用GridLayer时,Nebula NatTable未显示正确的单元格编辑器。

Eclipse rcp 使用GridLayer时,Nebula NatTable未显示正确的单元格编辑器。,eclipse-rcp,nattable,nebula,Eclipse Rcp,Nattable,Nebula,我编辑了一个Nebula示例_301_CustomDataProviderExample,以测试按tab键时的单元格编辑功能按tab键时启用下一个单元格编辑。使用GridLayer时出现问题:单元格编辑器显示不正确。我认为这是因为行和列标题,但我不知道如何调试或修复。你能帮我或给我一些提示吗?这是我编辑或添加的代码: @Override public Control createExampleControl(Composite parent) { String[][] testDat

我编辑了一个Nebula示例_301_CustomDataProviderExample,以测试按tab键时的单元格编辑功能按tab键时启用下一个单元格编辑。使用GridLayer时出现问题:单元格编辑器显示不正确。我认为这是因为行和列标题,但我不知道如何调试或修复。你能帮我或给我一些提示吗?这是我编辑或添加的代码:

 @Override
public Control createExampleControl(Composite parent) {

    String[][] testData = new String[3][3];
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            testData[i][j] = "" + i + "/" + j;
        }
    }

    IDataProvider bodyDataProvider = new TwoDimensionalArrayDataProvider(testData);
    final DataLayer bodyDataLayer = new DataLayer(bodyDataProvider);

    SelectionLayer selectionLayer = new SelectionLayer(bodyDataLayer);
    ViewportLayer viewportLayer = new ViewportLayer(selectionLayer);
    viewportLayer.addConfiguration(new DefaultEditConfiguration());
    viewportLayer.addConfiguration(new DefaultEditBindings());

    IDataProvider rowHeaderDataProvider = new DefaultRowHeaderDataProvider(bodyDataProvider);
    DataLayer rowHeaderDataLayer = new DataLayer(rowHeaderDataProvider, 40, DataLayer.DEFAULT_ROW_HEIGHT);
    rowHeaderDataLayer.setColumnsResizableByDefault(true);
    ILayer rowHeaderLayer = new RowHeaderLayer(rowHeaderDataLayer, viewportLayer, selectionLayer);

    IDataProvider columnHeaderDataProvider = new LetterColumnHeaderDataProvider(20);
    ILayer columnHeaderLayer = new ColumnHeaderLayer(
            new DefaultColumnHeaderDataLayer(columnHeaderDataProvider), viewportLayer, selectionLayer);

    IDataProvider conerDataProvider = new DefaultCornerDataProvider(columnHeaderDataProvider, rowHeaderDataProvider);
    ILayer cornerLayer = new CornerLayer(new DataLayer(conerDataProvider), rowHeaderLayer, columnHeaderLayer);

    GridLayer gridLayer = new GridLayer(viewportLayer, columnHeaderLayer, rowHeaderLayer, cornerLayer, false);

    final NatTable natTable = new NatTable(parent, false);
    natTable.setLayer(/* viewportLayer */ gridLayer);

    natTable.addConfiguration(new DefaultNatTableStyleConfiguration() {
        @Override
        public void configureRegistry(IConfigRegistry configRegistry) {
            super.configureRegistry(configRegistry);
            configRegistry.registerConfigAttribute(
                    EditConfigAttributes.CELL_EDITABLE_RULE,
                    IEditableRule.ALWAYS_EDITABLE);
        }
    });

    natTable.configure();

    return natTable;
}

该问题与在ViewportLayer上注册DefaultEditConfiguration有关。这样做将导致相对于主体层堆栈而不是GridLayer放置按键上标识的编辑器。应用于GridLayer的默认配置已包含必要的编辑配置。但是您通过GridLayer构造函数中的最后一个参数禁用了它

简而言之,从示例中删除以下两行,它们仅在没有GridLayer的合成情况下才需要

并将GridLayer的创建更改为


作为提示,当不理解不同示例的用途时,从不同示例复制代码时要小心。NatTable示例通常在代码中包含解释,以更详细地解释它们。

我不知道为什么,但当我通过以下方式声明gridLayer时,它运行良好:DefaultGridLayer gridLayer=new DefaultGridLayerByDataProvider,columnHeaderDataProvider;这是一个自创的问题,因为您从不同的示例中复制了一些代码行,而不了解它们的用途。答案中有解释。但是你在粘贴东西时需要更加小心。谢谢你的解释!我已经通过删除这些行并添加:gridLayer.addconfigurationnewdefaulteditconfiguration;gridLayer.addConfigurationnew DefaultEditBindings;
class LetterColumnHeaderDataProvider implements IDataProvider {

private int columns = 0;

public LetterColumnHeaderDataProvider(int columns) {
    this.columns = columns;
}

@Override
public Object getDataValue(int columnIndex, int rowIndex) {
    return (char) ('A' + columnIndex);
    // TODO: support column header AA-AZ, ZA-ZZ, ZZZ...
}

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

@Override
public int getColumnCount() {
    return this.columns;
}

@Override
public int getRowCount() {
    return 1;
}
}
viewportLayer.addConfiguration(new DefaultEditConfiguration());
viewportLayer.addConfiguration(new DefaultEditBindings());
GridLayer gridLayer = new GridLayer(viewportLayer, columnHeaderLayer, rowHeaderLayer, cornerLayer);