PopupMenuBuilder.withColumnRenameDialog не изменяет данные модели заголовка - PullRequest
0 голосов
/ 25 мая 2020

У меня есть 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());
  }

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

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

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

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

    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) никогда не вызывается, и, следовательно, данные модели никогда не обновляются , хотя метка в заголовке столбца меняется.

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

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

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

0 голосов
/ 25 мая 2020

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

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

...