2016-10-04 6 views
2

У меня есть TwinColSelect и текстовое поле, которое я использую для фильтрации содержимого таблицы, он отлично работает, но проблема в том, что фильтр фильтрует содержимое обоих столбцов TwinColSelect, а I хотел бы знать, возможно ли, что это влияет только на левый столбец.Vaadin TwinColSelect фильтрует только один столбец

Мой код прямо сейчас выглядит следующим образом:

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

Спасибо, Cris.

+1

Единственный способ будет построить фильтр, который делает НЕ фильтруйте элементы уже в назначенном списке –

+0

@ AndréSchild hmm, хорошая идея, человек, хорошая идея, действительно! Благодаря! – crigore

ответ

0

Я последовал предложение от @andreSchild в разделе комментариев вопроса, и разработали следующий класс, который работает отлично:

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

}

Смежные вопросы