Vaadin - 从地图向网格添加列
Vaadin - adding columns to grid from map
我想在 vaadin 的网格中显示数据,但我想为 customAttributes 列表中的每个值动态创建列。我的数据模型大致是这样的
Item
name: String
localization: Localization
visible: Boolean
customAttributes: List<CustomAttribute>
CustomAttribute
name: String
value: String
每个Item都有相同的一组属性类型,只是值不同。用户可以手动定义新的属性类型。
如何创建此网格?
目前我是这样做的:
grid.setColumns("name", "visible");
grid.addColumn(v -> v.getLocalization().getName()).setHeader("Localization");
但我不知道为每个自定义属性动态创建列。
就像评论中已经写的那样,假设您有属性名称的列表(或集合),您可以遍历属性名称。一个小陷阱是您需要以一种确保回调中的值有效最终的方式来执行此操作。
attributeNames.forEach(name -> {
grid.addColumn(item -> item.getCustomAttributes().get(name))
.setHeader(name);
});
如果您不直接知道属性名称,而是将所有项目加载到内存中而不是延迟加载它们,那么您可以通过遍历所有项目来找到唯一名称:
items.stream().flatMap(item -> item.getCustomAttributes().keySet().stream())
.distinct().forEach(<same loop as in the previous example>);
我想在 vaadin 的网格中显示数据,但我想为 customAttributes 列表中的每个值动态创建列。我的数据模型大致是这样的
Item
name: String
localization: Localization
visible: Boolean
customAttributes: List<CustomAttribute>
CustomAttribute
name: String
value: String
每个Item都有相同的一组属性类型,只是值不同。用户可以手动定义新的属性类型。
如何创建此网格? 目前我是这样做的:
grid.setColumns("name", "visible");
grid.addColumn(v -> v.getLocalization().getName()).setHeader("Localization");
但我不知道为每个自定义属性动态创建列。
就像评论中已经写的那样,假设您有属性名称的列表(或集合),您可以遍历属性名称。一个小陷阱是您需要以一种确保回调中的值有效最终的方式来执行此操作。
attributeNames.forEach(name -> {
grid.addColumn(item -> item.getCustomAttributes().get(name))
.setHeader(name);
});
如果您不直接知道属性名称,而是将所有项目加载到内存中而不是延迟加载它们,那么您可以通过遍历所有项目来找到唯一名称:
items.stream().flatMap(item -> item.getCustomAttributes().keySet().stream())
.distinct().forEach(<same loop as in the previous example>);