PopupMenuBuilder.withColumnRenameDialog не изменяет данные модели заголовка

У меня есть NatTable (table) с настраиваемой конфигурацией меню заголовка, настроенной следующим образом:

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

Класс конфигурации строит меню следующим образом:

  @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());
  }

Видимое состояние срабатывает, как и ожидалось. В конфигурации я также настраиваю слой для регистрации команды с моим конкретным слоем заголовка столбца:

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

Теперь, просматривая API DisplayColumnRenameDialogCommandHandler и т. д., я ожидаю, что в какой-то момент новое значение достигнет поставщика данных заголовка столбца через уровень заголовка столбца.

Сам слой заголовка столбца настраивается в классе редактора следующим образом:

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

ColumnHeaderDataProvider реализует IDataProvider, а getDataValue(int, int) прекрасно работает.

Проблема, с которой я сталкиваюсь, заключается в том, что ColumnHeaderDataProvider.setData(int, int, newValue) никогда не вызывается, и, следовательно, данные модели никогда не обновляются, хотя метка в заголовке столбца меняется.

Что мне не хватает?


person s.d    schedule 25.05.2020    source источник


Ответы (2)


Общий ColumnHeaderLayer не привязан к фактическим данным заголовка столбца, а к внутренней карте, предоставленной вспомогательным классом. Это (вероятно) потому, что в обычных случаях использования столбцы не привязаны к поставщику данных тела (как в моем случае), а просто к набору строк.

Чтобы фактически изменить данные в поставщике данных заголовка столбца, вы должны переопределить ColumnHeaderLayer renameColumnPosition(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;
  }

person s.d    schedule 25.05.2020

Переименование заголовка столбца отслеживается внутри ColumnHeaderLayer .

person Dirk Fauth    schedule 25.05.2020
comment
Спасибо, только что разобрался, см. stackoverflow.com/a/62009548/731040. Извините за резиновый уклон. - person s.d; 25.05.2020