如何向 Vaadin 7 Grid 添加带有过滤功能的嵌套复杂 属性?
How to add nested complex property with filtering to Vaadin 7 Grid?
我正在开发一个 Vaadin (7.10) 应用程序,在某些情况下,我需要将 "special" 嵌套 属性 添加到容器中。为了应用程序,我们使用 BeanItemContainer
和 Grid。我有一些 class 存储另一个 POJO 的 List
,我需要在第二个 POJO 中使用一个 属性 来过滤网格。配置的一个基本示例是:
public class A {
private String property1;
private String property2;
//There are too getters and setters for this two properties
}
public class B { //This class stores a list of As
private String name;
private List<A> list;
//Getters and setters too
}
这是我用来存储数据的两个基本 classes。显示数据的 Vaadin 代码为:
Grid grid = new Grid();
BeanItemContainer<B> container = new BeanItemContainer<>(B.class);
//////////////
container.addNestedContainerProperty("list.property1");
//This OBVIOUSLY doesn't work, because property1 is not part of List
/////////////
grid.setColumns("name");
grid.setContainerDataSource(container);
所以,我的问题是:
是否可以在 Grid
中显示此 property1
而无需更改 BeanItemContainer
?
这似乎是生成 属性 的工作。
但是:它仍然需要从 BeanItemContainer
更改或更详细,它需要包装它。无论如何,当我(几年前)这样做时,这不是问题。
为此你需要 GeneratedPropertyContainer
。它是其他需要添加生成属性的容器的包装器。
GeneratedPropertyContainer container =
new GeneratedPropertyContainer(yourBeanItemContainer);
将生成的属性添加到该容器
container.addGeneratedProperty("property1"
,new PropertyValueGenerator<String>() { ... });
上面提到的 PropertyValueGenerator
应该 return String
你可能会从一些 pojo A
.
中选择
Vaadin API for PropertyValueGenerator
考虑过滤的更新:PropertyValueGenerator
覆盖方法
modifyFilter(Container.Filter filter)
Return an updated filter that should be compatible with the underlying
container.
例如:如果您只是从列表中选择第一个 pojo A
及其 property1
,您可以执行此操作以使过滤器过滤掉所有第一个 B
a A
s property1
不匹配。
除了@pirho 的回答,这对我来说似乎很棒,还有另一种可能性:
您可以在 B
中创建一个 derivated 列表(如果您有权访问它),您想要过滤的属性如下:
public class B {
//Other already declared properties
private List<String> derivatedStringList;
//Here you declare getters and setters
public void setList(List<A> l) {
this.list = l;
this.derivatedStringList = l.stream()
.map(a -> a.getProperty1())
.collect(Collectors.toList());
}
//Only declare getter, because it's a -->generated<-- property
public List<String> getDerivatedStringList() {
return derivatedStringList;
}
}
然后在您的 Grid
、过滤器中使用它...任何您想要的地方。
我正在开发一个 Vaadin (7.10) 应用程序,在某些情况下,我需要将 "special" 嵌套 属性 添加到容器中。为了应用程序,我们使用 BeanItemContainer
和 Grid。我有一些 class 存储另一个 POJO 的 List
,我需要在第二个 POJO 中使用一个 属性 来过滤网格。配置的一个基本示例是:
public class A {
private String property1;
private String property2;
//There are too getters and setters for this two properties
}
public class B { //This class stores a list of As
private String name;
private List<A> list;
//Getters and setters too
}
这是我用来存储数据的两个基本 classes。显示数据的 Vaadin 代码为:
Grid grid = new Grid();
BeanItemContainer<B> container = new BeanItemContainer<>(B.class);
//////////////
container.addNestedContainerProperty("list.property1");
//This OBVIOUSLY doesn't work, because property1 is not part of List
/////////////
grid.setColumns("name");
grid.setContainerDataSource(container);
所以,我的问题是:
是否可以在 Grid
中显示此 property1
而无需更改 BeanItemContainer
?
这似乎是生成 属性 的工作。
但是:它仍然需要从 BeanItemContainer
更改或更详细,它需要包装它。无论如何,当我(几年前)这样做时,这不是问题。
为此你需要 GeneratedPropertyContainer
。它是其他需要添加生成属性的容器的包装器。
GeneratedPropertyContainer container =
new GeneratedPropertyContainer(yourBeanItemContainer);
将生成的属性添加到该容器
container.addGeneratedProperty("property1"
,new PropertyValueGenerator<String>() { ... });
上面提到的 PropertyValueGenerator
应该 return String
你可能会从一些 pojo A
.
Vaadin API for PropertyValueGenerator
考虑过滤的更新:PropertyValueGenerator
覆盖方法
modifyFilter(Container.Filter filter)
Return an updated filter that should be compatible with the underlying container.
例如:如果您只是从列表中选择第一个 pojo A
及其 property1
,您可以执行此操作以使过滤器过滤掉所有第一个 B
a A
s property1
不匹配。
除了@pirho 的回答,这对我来说似乎很棒,还有另一种可能性:
您可以在 B
中创建一个 derivated 列表(如果您有权访问它),您想要过滤的属性如下:
public class B {
//Other already declared properties
private List<String> derivatedStringList;
//Here you declare getters and setters
public void setList(List<A> l) {
this.list = l;
this.derivatedStringList = l.stream()
.map(a -> a.getProperty1())
.collect(Collectors.toList());
}
//Only declare getter, because it's a -->generated<-- property
public List<String> getDerivatedStringList() {
return derivatedStringList;
}
}
然后在您的 Grid
、过滤器中使用它...任何您想要的地方。