如何向 Vaadin 7 Grid 添加带有过滤功能的嵌套复杂 属性?

How to add nested complex property with filtering to Vaadin 7 Grid?

我正在开发一个 Vaadin (7.10) 应用程序,在某些情况下,我需要将 "special" 嵌套 属性 添加到容器中。为了应用程序,我们使用 BeanItemContainer 和 Grid。我有一些 class 存储另一个 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
}

这是我用来存储数据的两个基本 classes。显示数据的 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 应该 return String 你可能会从一些 pojo A.

中选择

Vaadin API for PropertyValueGenerator

考虑过滤的更新:PropertyValueGenerator 覆盖方法

modifyFilter(Container.Filter filter)

Return an updated filter that should be compatible with the underlying container.

例如:如果您只是从列表中选择第一个 pojo A 及其 property1,您可以执行此操作以使过滤器过滤掉所有第一个 Ba As 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、过滤器中使用它...任何您想要的地方。