Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

Locked History Actions

GWT/Widget/DataGrid

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

結局のところ、これはブラウザの情報の取得制限に関わる問題のようだ(あくまでも想像)。つまり、

  • ブラウザ画面がリサイズしたとき、「表」を表示する領域の大きさを把握することができないか、あるいはその中に表示可能な行数を決定することができない。
  • そこで、「ページサイズ」つまりページングをせずに表示可能な行数は固定的に決定するしかない。
  • 一つの「ページ」中の行データは一度に取得する必要がある。ページ全体を表示するのにスクロールが必要だとしても、未表示の部分をオンデマンドで取得する、というわけにはいかない。