Java 如何将带过滤的嵌套复杂特性添加到Vaadin 7网格?
我正在开发一个Vaadin(7.10)应用程序,在某些视图中,我需要在容器中添加一个“特殊”嵌套属性。为了应用程序,我们使用了Java 如何将带过滤的嵌套复杂特性添加到Vaadin 7网格?,java,vaadin,vaadin7,vaadin-grid,Java,Vaadin,Vaadin7,Vaadin Grid,我正在开发一个Vaadin(7.10)应用程序,在某些视图中,我需要在容器中添加一个“特殊”嵌套属性。为了应用程序,我们使用了BeanItemContainer和网格。我有一个类存储另一个POJO的列表,我需要在第二个POJO中使用一个属性来过滤网格。配置的一个基本示例是: public class A { private String property1; private String property2; //There are too getters and set
BeanItemContainer
和网格。我有一个类存储另一个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
}
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);
公共A类{
私有字符串属性1;
私有字符串属性2;
//这两个属性有太多的getter和setter
}
公共类B{//此类存储As的列表
私有字符串名称;
私人名单;
//也有能手和二传手
}
这是我用来存储数据的两个基本类。显示数据的Vaadin代码为:
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
}
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 Grid=new Grid();
BeanItemContainer=新的BeanItemContainer(B.class);
//////////////
container.addNestedContainerProperty(“list.property1”);
//这显然不起作用,因为属性1不在列表中
/////////////
grid.setColumns(“名称”);
grid.setContainerDataSource(容器);
所以,我的问题是:可以在
网格
中显示此属性1
,而无需从BeanItemContainer
?更改。这似乎是生成属性的作业
但是:它仍然需要从BeanItemContainer
进行更改,或者需要对其进行更详细的包装。不管怎样,当我(几年前)这么做的时候,这不是一个问题
为此,您需要GeneratedPropertyContainer
。它是需要添加生成属性的其他容器的包装器
GeneratedPropertyContainer container =
new GeneratedPropertyContainer(yourBeanItemContainer);
将生成的属性添加到该容器中
container.addGeneratedProperty("property1"
,new PropertyValueGenerator<String>() { ... });
返回更新的筛选器,该筛选器应与基础筛选器兼容
容器
例如:如果您只是从列表中选择第一个pojo
A
及其属性1
,您可以实现这一点,使过滤器过滤掉第一个A
s属性1
不匹配的所有B
A
您可以在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;
}
}
公共B类{
//其他已声明的属性
私有列表派生StringList;
//这里声明getter和setter
公共无效集合列表(列表l){
this.list=l;
this.derivetedStringList=l.stream()
.map(a->a.getProperty1())
.collect(Collectors.toList());
}
//只声明getter,因为它是-->生成的。这种方法的问题是生成的列不允许过滤,这是答案中所述的必须具备的。我将对其进行编辑以显示更多的强调。@Shirkam好的,我必须挖掘一些旧项目。我感觉这已经以某种方式解决了。如果使用GGeneratedPropertyContainer.addContainerFilter
它抛出不受支持的过滤器异常
或者为什么不允许?是的,它抛出不受支持的过滤器异常
哦,我不知道这一点,希望我能在简单性上给你两个伟大的解决方案。唯一的缺点是你需要触摸实体或为它创建一个包装类。@pirho我知道。但是如果你不想弄乱覆盖方法,你不知道它们是如何像modifyFilter
那样工作的,这是一个很好的解决方案。我想,我会两种都尝试。