我在做一个 Vaadin (7.10) 应用程序,在某些情况下,我需要在容器中添加一个“特殊”嵌套属性。为了应用程序,我们使用
BeanItemContainer
和 Grid。我有一些存储另一个 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
}
这是我的两个基本类,我用来存储数据。显示数据的 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
然后应该返回String
你可能从一些pojo中选择A
.
PropertyValueGenerator 的 Vaadin API
更新考虑过滤:
PropertyValueGenerator
覆盖方法
modifyFilter(Container.Filter filter)
返回一个应该与底层兼容的更新过滤器 容器。
例如:如果你只是从列表中选择第一个 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
,过滤器中使用它......无论你想要什么。