如何通过过滤添加嵌套复杂属性到Vaadin 7 Grid?

时间:2017-10-27 12:41:47

标签: java vaadin vaadin7 vaadin-grid

我正在做一个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

2 个答案:

答案 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中使用它,过滤器......无论你想要什么。