package org.vaadin.viritin.v7; import com.vaadin.annotations.Theme; import com.vaadin.ui.Component; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.apache.commons.beanutils.BeanComparator; import org.vaadin.addonhelpers.AbstractTest; import org.vaadin.viritin.v7.fields.MTable; import org.vaadin.viritin.testdomain.Person; import org.vaadin.viritin.testdomain.Service; /** * * @author Matti Tahvonen */ @Theme("valo") public class SortingWithCollections extends AbstractTest { @Override public Component getTestComponent() { final List<Person> listOfPersons = Service.getListOfPersons(100); final MTable<Person> table = new MTable(listOfPersons); // If the underlaying "property" is not sortable by default, you can // explicitly make it sortable via UI // table.setSortableProperties("foo", "bar",...); table.addSortListener(new MTable.SortListener() { @Override public void onSort(final MTable.SortEvent event) { // Skip default Vaadin proprietary container level sorting event.preventContainerSort(); // Use std JDK API, alternatively you could fetch a new sorted // list from your backend here and replace content Collections.sort(listOfPersons, new Comparator<Person>(){ @Override public int compare(Person o1, Person o2) { String sortProperty = event.getSortProperty(); /** * You could do anything you want here. Here just * use BeanComparator from commons-beanutils */ BeanComparator<Person> beanComparator = new BeanComparator<>(); beanComparator.setProperty(sortProperty); if(event.isSortAscending()) { return beanComparator.compare(o1, o2); } else { return - beanComparator.compare(o1, o2); } } }); // Notify Table that its content has changed table.refreshRowCache(); } }); return table; } }