2017-10-27 1 views
2

Ich mache eine Vaadin (7.10) App, und in einer Ansicht müsste ich eine "spezielle" verschachtelte Eigenschaft in den Container einfügen. Für die Anwendung verwenden wir BeanItemContainer und Grid. Ich habe eine Klasse, die ein List eines anderen POJO (s) speichert, und ich würde eine Eigenschaft innerhalb dieses zweiten POJO verwenden müssen, um das Gitter zu filtern. Ein grundlegendes Beispiel der Konfiguration wäre:Wie geschachtelte komplexe Eigenschaft mit Filterung zu Vaadin 7 Grid hinzufügen?

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 
} 

Dies sind meine zwei grundlegenden Klassen, die ich verwende, um Daten zu speichern. Die Vaadin Codedaten zu zeigen, wäre:

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); 

Also, meine Frage ist:
möglich ist, in Grid dieseproperty1ohne BeanItemContainer Wechsel zu zeigen?

Antwort

2

Dies scheint wie ein Job für eine generierte Eigenschaft.

ABER: es erfordert immer noch Änderungen von BeanItemContainer oder detaillierter es erfordert es zu wickeln. Jedenfalls war es kein Problem, als ich es tat (vor Jahren).

Dafür benötigen Sie GeneratedPropertyContainer. Es ist ein Wrapper für andere Container, für die generierte Eigenschaften hinzugefügt werden müssen.

GeneratedPropertyContainer container = 
    new GeneratedPropertyContainer(yourBeanItemContainer); 

Add erzeugte Eigenschaften zu diesem Container

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

Oberhalb mentiond PropertyValueGenerator sollte dann wieder String, die Sie möglicherweise von einem pojo A wählen.

Vaadin API for PropertyValueGenerator

aktualisieren Filterung Berücksichtigung PropertyValueGenerator Überschreibungen Methode

modifyFilter(Container.Filter filter) 

Return ein aktualisierter Filter, der mit dem darunterliegenden Container kompatibel sein sollte.

Zum Beispiel: Wenn Sie nur die ersten pojo A aus der Liste auswählen und seine property1 die Sie dies die Filter implementieren könnten, um all B zum Ausfiltern ein, deren ersten A s property1 stimmt nicht überein.

+0

Das Problem mit diesem Ansatz ist, dass generierte Spalten keine Filterung zulassen, und dies ist ein ** Muss ** ** wie in der Antwort angegeben. Ich werde es bearbeiten, um mehr Betonungen darauf zu zeigen. – Shirkam

+0

@Shirkam Ok, ich muss ein altes Projekt graben. Ich habe das Gefühl, dass das irgendwie gelöst wurde. War es so, dass wenn Sie 'GeneratedPropertyContainer.addContainerFilter' verwenden,' 'UnsupportedFilterException' ausgelöst wird oder warum es nicht erlaubt ist? – pirho

+0

Yup, es wirft 'UnsupportedFilterException' – Shirkam

1

Abgesehen von @ pirho Antwort, die mir brillant schien, gibt es eine andere Möglichkeit:

Sie können eine erstellen derivated Liste in B (wenn Sie Zugriff darauf haben) der Eigenschaften, die Sie wie filternde dies:

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; 
    } 
} 

Und dann verwenden Sie es in Ihrem Grid, Filter ... Wo auch immer Sie wollen.

+0

Große Lösung in der Einfachheit. Die einzige Konsequenz ist, dass Sie Entität berühren oder eine Wrapper-Klasse dafür erstellen müssen. – pirho

+0

@pirho Ich weiß es. Aber wenn Sie keine übersteuernden Methoden durcheinander bringen möchten, wissen Sie nicht, wie sie funktionieren, wie 'modifyFilter', es ist ein großartiger Workaround. Ich werde beides versuchen, dachte ich. – Shirkam