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
实现了 IDataProvider
,getDataValue(int, int)
工作得很好。
我遇到的问题是 ColumnHeaderDataProvider.setData(int, int, newValue)
从未被调用,因此模型数据永远不会更新,尽管 label列 header 更改。
我错过了什么?
通用 ColumnHeaderLayer
未绑定到实际列 header 数据,而是绑定到助手 class 提供的内部映射。这(可能)是因为在通常的用例中,列不绑定到 body 数据提供程序(如我的情况),而只是绑定到一堆字符串。
要实际更改列 header 数据提供者中的数据,您必须覆盖 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;
}
在 ColumnHeaderLayer
中跟踪列 header 的重命名。
我有一个带有自定义 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
实现了 IDataProvider
,getDataValue(int, int)
工作得很好。
我遇到的问题是 ColumnHeaderDataProvider.setData(int, int, newValue)
从未被调用,因此模型数据永远不会更新,尽管 label列 header 更改。
我错过了什么?
通用 ColumnHeaderLayer
未绑定到实际列 header 数据,而是绑定到助手 class 提供的内部映射。这(可能)是因为在通常的用例中,列不绑定到 body 数据提供程序(如我的情况),而只是绑定到一堆字符串。
要实际更改列 header 数据提供者中的数据,您必须覆盖 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;
}
在 ColumnHeaderLayer
中跟踪列 header 的重命名。