我正在做一个Vaadin(7.10)应用程序,在某些视图中,我需要添加一个"特殊的"嵌套属性进入容器。为了应用起见,我们使用了BeanItemContainer
和Grid。我有一些类存储List
个其他POJO,我需要在第二个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
?
答案 0 :(得分:2)
这似乎是生成财产的工作。
但是:它仍然需要更改BeanItemContainer
或更详细它需要包装它。无论如何,当我这么做时(几年前)它不是问题。
为此你需要GeneratedPropertyContainer
。它是需要生成属性的其他容器的包装器。
GeneratedPropertyContainer container =
new GeneratedPropertyContainer(yourBeanItemContainer);
将生成的属性添加到该容器
container.addGeneratedProperty("property1"
,new PropertyValueGenerator<String>() { ... });
上面提到的PropertyValueGenerator
应该返回String
您可能从某些pojo A
中选择的内容。
Vaadin API for PropertyValueGenerator
考虑过滤更新:PropertyValueGenerator
覆盖方法
modifyFilter(Container.Filter filter)
返回应与基础版兼容的更新过滤器 容器
例如:如果您只是从列表及其A
中选择第一个pojo property1
,则可以实现此操作以使过滤器过滤掉其第一个B
a A
a 1}} s property1
不匹配。
答案 1 :(得分:1)
除了@ pirho的答案,这对我来说似乎很棒,还有另一种可能性:
您可以在B
(如果您有权访问)中创建一个派生列表,其中包含您想要过滤的属性,如下所示:
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
中使用它,过滤器......无论你想要什么。