Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将带过滤的嵌套复杂特性添加到Vaadin 7网格?_Java_Vaadin_Vaadin7_Vaadin Grid - Fatal编程技术网

Java 如何将带过滤的嵌套复杂特性添加到Vaadin 7网格?

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

我正在开发一个Vaadin(7.10)应用程序,在某些视图中,我需要在容器中添加一个“特殊”嵌套属性。为了应用程序,我们使用了
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
那样工作的,这是一个很好的解决方案。我想,我会两种都尝试。