2011-08-11 64 views
2

我正在阅读如何将列排序函数添加到单元格表,但我不理解谷歌提供的代码。以下是我的celltable,我将如何添加使nameColumn排序?GWT - 如何分类celltable列?

public class CellTableExample implements EntryPoint { 

    private static class Contact { 
     private String address; 
     private String name; 

     public Contact(String name, String address) { 
      super(); 
      this.address = address; 
      this.name = name; 
     } 
    } 

    // The list of data to display. 
     private static List<Contact> CONTACTS = Arrays.asList(
     new Contact("John", "123 Fourth Road asdf asdf asdfasdf"), 
     new Contact("Mary", "222 Lancer Lane") 

    ); 

    @Override 
    public void onModuleLoad() { 
     CellTable<Contact> table = new CellTable<Contact>(); 

     //address column 
     TextColumn<Contact> addressColumn = new TextColumn<Contact>(){ 
      @Override 
      public String getValue(Contact contact) { 
       return contact.address; 
      } 
     }; 

     //name column 
     TextColumn<Contact> nameColumn = new TextColumn<Contact>(){ 
      @Override 
      public String getValue(Contact contact) { 
       return contact.name; 
      } 
     }; 

     // Add the columns. 
     table.addColumn(nameColumn, "Name"); 
     table.addColumn(addressColumn, "Address"); 

     table.setRowCount(CONTACTS.size(), true); 
     table.setRowData(0, CONTACTS); 

     RootPanel.get().add(table); 
    } 

} 

回答

9

我想你reffering到Developer's Guide - Cell Table。如果你有运行的第一个例子,你可以使名称科拉姆排序与

table.getColumn(0).setSortable(true); 

(加小箭头名)顺便说一下,这是我不得不addeto让您的例子运行的代码(只是复制后“ RootPanel.get()增加(表)”,并与您的项目名称取代“_01_scheduleDeferred”)

// Create a data provider. 
    ListDataProvider<Contact> dataProvider = new ListDataProvider<Contact>(); 

    // Connect the table to the data provider. 
    dataProvider.addDataDisplay(table); 

    // Add the data to the data provider, which automatically pushes it to the 
    // widget. 
    List<Contact> list = dataProvider.getList(); 
    for (Contact contact : CONTACTS) { 
     list.add(contact); 
    } 

    // Add a ColumnSortEvent.ListHandler to connect sorting to the 
    // java.util.List. 
    ListHandler<Contact> columnSortHandler = new ListHandler<_01_scheduleDeferred.Contact>(
     list); 
    columnSortHandler.setComparator(nameColumn, 
     new Comparator<_01_scheduleDeferred.Contact>() { 
     @Override 
     public int compare(_01_scheduleDeferred.Contact o1, _01_scheduleDeferred.Contact o2) { 
      if (o1 == o2) { 
        return 0; 
       } 

       // Compare the name columns. 
       if (o1 != null) { 
        return (o2 != null) ? o1.name.compareTo(o2.name) : 1; 
       } 
       return -1; 
     } 
     }); 
    table.addColumnSortHandler(columnSortHandler); 

    // We know that the data is sorted alphabetically by default. 
    table.getColumnSortList().push(nameColumn); 
+0

我不明白用_01_scheduleDeffered替换项目名称的重要性。它的用法是什么,我们可以给它任何数字。 – Ashish

+0

_01_scheduleDeffered是我项目的名字。你可以用你的班级 – Stefan

+0

的路径替换它,好吧,非常感谢 – Ashish

0

我已经写了一个实用程序类来封装添加排序TextColumn到CellTable,这将使事情更容易。我敢肯定,这将演变在接下来的几天里,但这里是我迄今的工作...

package your.package.here; 

import com.google.gwt.user.cellview.client.CellTable; 
import com.google.gwt.user.cellview.client.ColumnSortEvent; 
import com.google.gwt.user.cellview.client.TextColumn; 
import com.google.gwt.view.client.ListDataProvider; 

import java.util.Comparator; 

/** 
* Created by alex on 8/3/16. 
*/ 
public class CellTableUtil 
{ 
    public static <D> void addSortableTextColumn(CellTable<D> table, ListDataProvider<D> dataProvider, 
             String columnTitle, final FieldExtractor<D, String> fieldExtractor) 
    { 
     final TextColumn<D> col = new TextColumn<D>() 
     { 
      @Override 
      public String getValue(D client) 
      { 
       return String.valueOf(fieldExtractor.getField(client)); 
      } 
     }; 
     col.setSortable(true); 
     table.addColumn(col, columnTitle); 

     ColumnSortEvent.ListHandler<D> columnSortHandler = new ColumnSortEvent.ListHandler<>(
       dataProvider.getList()); 
     columnSortHandler.setComparator(col, 
       new Comparator<D>() { 
        public int compare(D o1, D o2) { 
         if (o1 == o2) { 
          return 0; 
         } 

         // Compare the fields of the Client 
         if (o1 != null) { 
          return (o2 != null) ? 
            fieldExtractor.getField(o1).compareTo(fieldExtractor.getField(o2)) : 1; 
         } 
         return -1; 
        } 
       }); 
     table.addColumnSortHandler(columnSortHandler); 
    } 

    /** 
    * Created by alex on 8/3/16. 
    */ 
    public static interface FieldExtractor<D, T> 
    { 
     public T getField(D dataEntity); 
    } 
} 

在我的代码,我在表中列出的数据类型被称为“客户端”,它有一个getFirstName()方法。现在你可以调用这种方法来添加一个可排序的列到你的表中,像这样...

CellTableUtil.addSortableTextColumn(table, dataProvider, "First Name", 
       new CellTableUtil.FieldExtractor<Client, String>() { 
      @Override 
      public String getField(Client c) 
      { 
       return c.getFirstName(); 
      } 
     });