2011-08-11 15 views
2

セルソート機能をセルテーブルに追加する方法についてはお伝えしていますが、Googleが提供するコードは理解できません。以下は私の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

私はあなたがDeveloper's Guide - Cell Tableにrefferingされているとします。あなたが実行している最初の例を得た場合は、ソート可能な名前columは

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

私が作るでしょうCellTableにソート可能なTextColumnを追加カプセル化するutilのクラスを書きました物事は簡単です。私は私のコードで

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(); 
      } 
     }); 
関連する問題