PopupMenuBuilder.withColumnRenameDialog 不更改 header 模型数据

PopupMenuBuilder.withColumnRenameDialog doesn't change header model data

我有一个带有自定义 header 菜单配置的 NatTable (table),设置如下:

table.addConfiguration(new CustomHeaderMenuConfiguration(table, columnHeaderLayer));

配置class构建菜单如下:

  @Override
  protected PopupMenuBuilder createColumnHeaderMenu(NatTable natTable) {
    return super.createColumnHeaderMenu(natTable).withHideColumnMenuItem("Hide column(s)")
        .withColumnRenameDialog("Change annotation name").withVisibleState(
            PopupMenuBuilder.COLUMN_RENAME_MENU_ITEM_ID, new ValidRenamableHeaderState());
  }

可见状态按预期触发。在配置中,我还配置了layer来注册命令到我特定的列header layer:

  @Override
  public void configureLayer(ILayer layer) {
    layer.registerCommandHandler(
        new DisplayColumnRenameDialogCommandHandler(this.columnHeaderLayer));
  }

现在通过 DisplayColumnRenameDialogCommandHandler 的 API 等进行爬网,我希望在某个时候,新值将通过列到达 header 列数据提供程序header层。

列header图层本身在编辑器中是这样设置的class:

    final IDataProvider columnHeaderDataProvider = new ColumnHeaderDataProvider(bodyDataProvider);
    final ColumnHeaderLayer columnHeaderLayer =
        new ColumnHeaderLayer(new DefaultColumnHeaderDataLayer(columnHeaderDataProvider),
            compositeFreezeLayer, selectionLayer);

ColumnHeaderDataProvider 实现了 IDataProvidergetDataValue(int, int) 工作得很好。

我遇到的问题是 ColumnHeaderDataProvider.setData(int, int, newValue) 从未被调用,因此模型数据永远不会更新,尽管 label列 header 更改。

我错过了什么?

通用 ColumnHeaderLayer 未绑定到实际列 header 数据,而是绑定到助手 class 提供的内部映射。这(可能)是因为在通常的用例中,列不绑定到 body 数据提供程序(如我的情况),而只是绑定到一堆字符串。

要实际更改列 header 数据提供者中的数据,您必须覆盖 ColumnHeaderLayerrenameColumnPosition(int, String) 以解决实际数据提供者的 setData(int, int, Object),而不是内部地图。

这是一个例子:

@Override
  public boolean renameColumnPosition(int columnPosition, String customColumnName) {
    IDataProvider dataProvider =
        ((DefaultColumnHeaderDataLayer) this.getBaseLayer()).getDataProvider();
    Object oldData = dataProvider.getDataValue(columnPosition, 0);
    boolean renamed = (!oldData.equals(customColumnName));
    if (renamed) {
      dataProvider.setDataValue(columnPosition, 0, customColumnName);
      fireLayerEvent(new RenameColumnHeaderEvent(this, columnPosition));
    }
    return renamed;
  }

ColumnHeaderLayer 中跟踪列 header 的重命名。