[Wicket-ja-user 203] Re: 列、行ともに可変の縦横に伸びる表について

Back to archive index

shinya okino shiny****@gmail*****
2008年 8月 6日 (水) 13:15:33 JST


沖野です。

DataTableはコンストラクタに渡すIColumnの配列数が、列の数になります。
そこを変えればプログラム側で列の数を変えられます。
そして、IColumnのpopulateItemメソッドで、1レコードの出力内容が制御できます。実際にはPropertyColumnやAbstractColumnを使うと思います。

元のテーブルを実装するとこのような感じになります。
public class ProductPage extends WebPage {
  /**
   * 製品クラス
   */
  private static class Product implements Serializable {
    /** 名前 */
    private String name;
    /** 特長 */
    private List<String> featrueList;

    public Product(String name, String feature1, String feature2) {
      this.name = name;
      this.featrueList = new ArrayList<String>();
      featrueList.add(feature1);
      featrueList.add(feature2);
    }
    public String getName() {
      return name;
    }
    public List<String> getFeatrueList() {
      return featrueList;
    }
  }

  /** 製品リスト */
  public static final List<Product> PRODUCT_LIST = new ArrayList<Product>() {
    {
      add(new Product("商品 1", "AAA", "あああ"));
      add(new Product("商品 2", "BBB", "いいい"));
    }
    };

    public ProductPage() {
      List<IColumn> columns = new ArrayList<IColumn>();
      columns.add(new PropertyColumn(new Model("商品名"), "name"));

   //特長分の列を追加
      for (int i = 0; i < 2; i++) {
        final int index = i;
        columns.add(new AbstractColumn(new Model("特長"+
Integer.toString(i + 1))){
          @Override
          public void populateItem(Item cellItem, String componentId,	
                                                 IModel rowModel) {
            Product product = (Product) rowModel.getObject();
            cellItem.add(new Label(componentId,
product.getFeatrueList().get(index)));
          }
        });
      }

      SortableDataProvider provider = new SortableDataProvider() {
        @Override
        public Iterator iterator(int first, int count) {
          return PRODUCT_LIST.iterator();
        }

        @Override
        public IModel model(Object object) {
          return new Model((Serializable) object);
        }

        @Override
        public int size() {
          return PRODUCT_LIST.size();
        }
      };

      DataTable dataTable = new DataTable("table", (IColumn[]) columns
             .toArray(new IColumn[columns.size()]), provider,
PRODUCT_LIST.size());

      dataTable.addTopToolbar(new HeadersToolbar(dataTable, provider));

      add(dataTable);
    }
}

htmlはこれだけです。
<body>
<table wicket:id="table">
</table>
</body>

これでヘッダ行も含めて
━━━━━━━━━━
商品名┃特長1┃特長2
━━━━━━━━━━
商品 1┃ AAA ┃あああ.
━━━━━━━━━━
商品 2┃ BBB ┃ いいい
━━━━━━━━━━
が出力されます。

もっと複雑な行単位で列の数が可変でcolspanで結合するようなテーブルは扱えないですが、普通の用途には充分だと思います。

-- 
沖野信也
shiny****@gmail*****




Wicket-ja-user メーリングリストの案内
Back to archive index