Locked History Actions

Diff for "GWT/Widget/DataGrid"

Differences between revisions 6 and 7
Deletions are marked like this. Additions are marked like this.
Line 56: Line 56:
これができれば、スクロールをやめてPagerによるページングが適切にできることになる。

DataGrid

CellTableでは大きな行数のデータを表示しようとすると様々な不都合が生じる(CellTableを参照)。 DataGridでは、PageSizeを設定する必要はあるが(PageSizeを超えるデータは無視されてしまう)、勝手にスクロールバーがついてくれ、列ヘッダは固定してくれるので圧倒的に楽である。

DataGridの使えなさ

  • DataGridでもgetVisibleRange(),getVisibleItemCount()の値は、実際にユーザに見える行数を表しているわけではなく、全データ数になってしまう。このため、大量のデータの一部のみをスクロールバーで移動しながらオンデマンドで必要なデータを取得するということはできない。結局、ページングでしかこのような仕組みは実現できないようだ(が、ページングの場合には、ブラウザのリサイズによって表示行数が変わるという問題が残る)。

しかし、GXTでもこの事情は同じようだ。以下はGXTのサンプル

import java.util.*;

import com.extjs.gxt.ui.client.data.*;
import com.extjs.gxt.ui.client.store.*;
import com.extjs.gxt.ui.client.widget.grid.*;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.google.gwt.core.client.*;
import com.google.gwt.user.client.ui.*;

public class ImageViewer implements EntryPoint {
  
  class ModelDataAdapter implements  ModelData {
    public <X> X get(String property) { throw new RuntimeException(); }
    public Map<String, Object> getProperties() { throw new RuntimeException(); }
    public Collection<String> getPropertyNames() { throw new RuntimeException(); }
    public <X> X remove(String property) { throw new RuntimeException(); }
    public <X> X set(String property, X value) { throw new RuntimeException(); }
  }
 
  public void onModuleLoad() {
    RootLayoutPanel rootPanel = RootLayoutPanel.get();

    ColumnModel model = 
        new ColumnModel(Arrays.asList(new ColumnConfig[] { new ColumnConfig("title", 500) }));
    ListStore<ModelData> store = new ListStore<ModelData>();
    for (int i = 0; i < 1000; i++) {
      final int index = i;
      store.add(new ModelDataAdapter() {
        public String get(String name) {
          System.out.println("" + index);
          return name + index;
        }
      });
    }
    Grid<ModelData> grid = new Grid<ModelData>(store, model);

    rootPanel.add(grid);
    grid.setSize("640px", "480px");
  }
}

次善の策としては、ブラウザ画面のリサイズに応じて適切なページサイズを設定することができるか、という点である。 これができれば、スクロールをやめてPagerによるページングが適切にできることになる。