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

问题描述 投票:0回答:2

我在做一个 Vaadin (7.10) 应用程序,在某些情况下,我需要在容器中添加一个“特殊”嵌套属性。为了应用程序,我们使用

BeanItemContainer
和 Grid。我有一些存储另一个 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
}

这是我的两个基本类,我用来存储数据。显示数据的 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

java vaadin vaadin7 vaadin-grid
2个回答
2
投票

这似乎是生成属性的工作。

但是:它仍然需要从

BeanItemContainer
或更详细的它需要包装它进行更改。无论如何,当我(几年前)这样做时这不是问题。

为此你需要

GeneratedPropertyContainer
。它是其他需要添加生成属性的容器的包装器。

GeneratedPropertyContainer container =
    new GeneratedPropertyContainer(yourBeanItemContainer);

将生成的属性添加到该容器

container.addGeneratedProperty("property1"
   ,new PropertyValueGenerator<String>() { ... });

上面提到的

PropertyValueGenerator
然后应该返回
String
你可能从一些pojo中选择
A
.

PropertyValueGenerator 的 Vaadin API

更新考虑过滤:

PropertyValueGenerator
覆盖方法

modifyFilter(Container.Filter filter)

返回一个应该与底层兼容的更新过滤器 容器。

例如:如果你只是从列表中选择第一个 pojo

A
和它的
property1
你可以实现这个来使过滤器过滤掉所有
B
a 其第一个
A
s
property1
不匹配.


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.