2017-10-27 9 views
2

私はVaadin(7.10)アプリを使っていますが、いくつかの点では、コンテナに「特別な」ネストされたプロパティを追加する必要があります。アプリケーションのために、BeanItemContainerとGridを使用しています。私は別のPOJOのListを格納するクラスを持っています、そして、私はそれらの2番目のPOJOの中で1つのプロパティを使ってグリッドをフィルタリングする必要があります。設定の基本的な例は、次のようになります。Vaadin 7 Gridにフィルタリングしたネストされた複合プロパティを追加するには?

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 
} 

これらは私がデータを保存するのに使う2つの基本的なクラスです。データを表示する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); 

だから、私の質問は次のとおりです。
BeanItemContainerから変更することなく、このproperty1Gridに表示することは可能ですか?

答えて

2

これは生成されたプロパティの仕事のようです。

しかし、まだ変更する必要があります。BeanItemContainer以上の場合、それをラッピングする必要があります。とにかく、私が(何年も前に)それをしたときは問題ではなかった。

これにはGeneratedPropertyContainerが必要です。生成されたプロパティを追加する必要がある他のコンテナのラッパーです。

GeneratedPropertyContainer container = 
    new GeneratedPropertyContainer(yourBeanItemContainer); 

、あなたはおそらくいくつかのPOJO Aから選ぶStringを返す必要があり、そのコンテナにmentiond PropertyValueGenerator上記

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

を生成されたプロパティを追加します。フィルタリング考慮

Vaadin API for PropertyValueGenerator

更新:PropertyValueGeneratorオーバーライドメソッド

modifyFilter(Container.Filter filter) 

戻り基礎となる コンテナと互換性があります更新されたフィルタ。例えば

:あなたは、その最初Aproperty1が一致しないすべてのBをフィルタリングするフィルタを作成し、これを実装することができ、あなただけのリストから最初のPOJO Aを選ぶ場合は、そのproperty1。別に

+0

この方法の問題は、生成された列がフィルタリングを許可しないことです。これは**答えに**記載されている必要があります。もっと強調するために編集します。 – Shirkam

+0

@Shirkamさて、私は古いプロジェクトを掘り起こす必要があります。私はこれが何とか解決されたと感じています。 'GeneratedPropertyContainer.addContainerFilter'を使うと' UnsupportedFilterException'がスローされたのですか、なぜ許可されないのですか? – pirho

+0

うん、それは 'UnsupportedFilterException'をスローする – Shirkam

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、フィルタで使用します。

+0

シンプルで素晴らしいソリューション。唯一の欠点は、エンティティに触れるか、エンティティのラッパークラスを作成する必要があることです。 – pirho

+0

@pirho私はそれを知っています。しかし、もしあなたが 'modifyFilter'のように動作するかどうかわからない、オーバーライドする方法を混乱させたくなければ、これは大きな作業の中心です。私は両方を試してみる、と思った。 – Shirkam

関連する問題