2016-10-04 2 views
2

J'ai un TwinColSelect et un Textfield que j'utilise pour filtrer le contenu de la table, cela fonctionne très bien, mais le problème est que le filtre filtre le contenu des deux columnos du TwinColSelect, et je aimerait savoir s'il est possible que cela affecte seulement la colonne de gauche.Vaadin TwinColSelect filtre une seule colonne

Mon bon code ressemble maintenant à ceci:

final TwinColSelect select = new TwinColSelect(); 
    select.setItemCaptionPropertyId(PersistenceLoinc.CORPUS_NOMBRE); 

    TextField filtro = new TextField(); 

    filtro.addTextChangeListener(new TextChangeListener() { 


     private static final long serialVersionUID = 1L; 
     SimpleStringFilter filter = null; 

     @Override 
     public void textChange(TextChangeEvent event) { 
      Filterable f = (Filterable) select.getContainerDataSource(); 

      if (filter != null) { 
       f.removeContainerFilter(filter); 
      } 
      filter = new SimpleStringFilter(select.getItemCaptionPropertyId(), event.getText(), true, false); 
      f.addContainerFilter(filter); 
     } 
    }); 

Merci, Cris.

+1

La seule façon serait de construire un filtre qui ne PAS filtrer les articles déjà dans la liste affectée –

+0

@ AndréSchild hmm, bonne idée, mec, bonne idée, en effet! Merci! – crigore

Répondre

0

J'ai suivi la suggestion de @andreSchild dans la section des commentaires de la question, et a développé la classe suivante qui fonctionne parfaitement:

public class TwinColSelectStringFilter implements Container.Filter { 

final SimpleStringFilter spf; 
final TwinColSelect select; 
final Object propertyId; 

public TwinColSelectStringFilter(Object propertyId, String filterString, boolean ignoreCase, boolean onlyMatchPrefix, TwinColSelect select) { 
    spf = new SimpleStringFilter(propertyId, filterString, ignoreCase, onlyMatchPrefix); 
    this.select = select; 
    this.propertyId=propertyId; 
} 

@Override 
public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException { 
    if(select.getValue() != null && (select.getValue() instanceof Collection)) { 
     if (((Collection<Integer>) select.getValue()).contains(itemId)) { 
      return true; 
     } 
    } 
    return spf.passesFilter(itemId, item); 
} 

@Override 
public boolean appliesToProperty(Object propertyId) { 
    return spf.appliesToProperty(propertyId); 
} 

}