2008年4月28日 のアーカイブ

ExtJS Ext.grid.GridPanelの使い方

ExtJS Ext.grid.GridPanelの使い方をはてなブックマークに追加 ExtJS Ext.grid.GridPanelの使い方をdel.icio.usに追加 Yahoo!ブックマークに登録 ExtJS Ext.grid.GridPanelの使い方をGoogle Bookmarksに追加 ExtJS Ext.grid.GridPanelの使い方をtwitterにポスト
2008年4月28日 月曜日
simplegrid.PNG
ExtJSの使い方をポストします。このExtJSのエントリはこちらのブログに整理してアーカイブしていきます。

まず、ExtJS javascriptライブラリをダウンロードページより、アーカイブ(Ext JS 2.1 SDK)をダウンロードして解凍してください。20080428時点のバージョンは ext-2.1 です。解凍したら、以下のパスのファイルを開いて見ましょう。gridのサンプルはココからも見れます。

【パス】
ext-2.1\examples\grid\array-grid.html

このウィジェットがgridと呼ばれるものです。エクセルのような罫線で表現されたウィジェットで、

  • ソート
  • 各セルの編集
  • グルーピング
  • サマリ
  • フィルタ

なんかも出来ます。すごいですね。今日はこのgridの基本的な実装を解説してみたいと思います。あと、いきなりgirdとか言われても・・と言う方にはここにExtJSのチュートリアルを簡単にまとめてみました。
まず、以下に今回解説するgridのソースを全て載せてみましたので、この実装方法とコンフィグを解説します。

動作サンプルとサンプルソース

Ext.onReady( function(){
var store = new Ext.data.SimpleStore({
fields: [
{ name: 'a' },
{ name: 'b' }
],
data:[
[ 'hoge', 1 ],
[ 'moge', 2 ],
[ 'fuga', 3 ]
]
});
var clmnModel = new Ext.grid.ColumnModel([
{ header: "title", width: 200, dataIndex: 'a' },
{ header: "number", width: 100, sortable: true, dataIndex: 'b' }
]);
var grid = new Ext.grid.GridPanel({
store:store,
colModel:clmnModel,
renderTo:'renderTarget',
title:'simple-grid',
stripeRows:true,
height:150,
width:316,
frame:true
});
});

【Ext.grid.GridPanelの解説】

それではgirdを見ていきたいと思います。

var grid = new Ext.grid.GridPanel({

という箇所がグリッドそのものになります。この定義の仕方は、これからたくさん出てくるので先に解説してしまいます。
Ext.grid.GridPanel({});の{}定義体はオブジェクトリテラルと呼ばれるもので、ExtJSではこの書式で実装していくことがほとんどです。使ってみればそんなに難しいものでは無く、
オブジェクトリテラルとは

  • 中カッコ{}で囲まれて、
  • カンマ,を使ってプロパティが区切られて定義されるもの

だと理解すればいいのではないかと思います。多分乱暴に色々切り捨てた言い方をしたのかもしれませんが、ワタシはそう理解しています。
そしてこのオブジェクトリテラルのプロパティ1つ1つを、ExtJSではコンフィグオプションと呼んでいます。

Ext.grid.GridPanel({ /* コンフィグオプション群 */ })

このコンフィグオプションによって、いろんな表示設定や、機能設定が出来るようになっています。
サンプルソースのgridのコンフィグオプションを上から見ていくと、
store / colModel / renderTo / title / stripeRows / height / width / frame とありまして、このほかにも様々なコンフィグオプションがありますが、GridPanelで必須とされるのは store と colModel になります。ただ、renderToで表示先を指定してあげないと、このサンプルソースではgridが表示されませんので、このstore / colModel / renderTo以外をコメントアウトしたりしてどんなコンフィグなのか試してみるといいかもしれません。

それではこのコンフィグを解説していきたいと思います。
storeは、APIDocumentに

store : Ext.data.Store
The Ext.data.Store the grid should use as its data source (required).

とあり、storeはデータソースであることがわかります。データの実体ですね。その型はExt.data.Storeを使っているよーと言うことです。

colModelは、

colModel : Object
The Ext.grid.ColumnModel to use when rendering the grid (required).

とあり、girdの列定義をあらわしています。
ちなみにcolModelは、cmというコンフィグオプション名でもよくて、cmは、colModelを表すshorthand(ショートハンド(エイリアス?))だとAPIDocにあります。どちらでもいいですが、colModel / cm は必須コンフィグです。

renderToは、

renderTo:'renderTarget',

先にも記述したとおり、表示先を指定するコンフィグです。document.bodyとか、DOMノードのidを表示先に設定してあげます。サンプルソースのように、コンフィグオプションでレンダリング先を指定してあげることも出来ますし、出来上がったgridから以下のようにしてメソッドとして呼び出すことも出来ます。(メソッド名とコンフィグオプションは必ずしも一致しませんし、コンフィグオプションが全てメソッドとして利用できるわけではなさそうです。)

var grid = new Ext.grid.GridPanel({ /* config options */ });
grid.render( 'renderTarget' );

サンプルソースで使ったコンフィグの残りは表示レイアウトのオプションになります。

title:'simple-grid',
stripeRows:true,
height:150,
width:316,
frame:true

titleはgirdのタイトルになります。これを設定しないとタイトルバーごと表示されません。何かを設定すれば、(例えば空文字でも)タイトルバーは残ります。
stripeRowsは、行を縞々に表示するコンフィグです。ちょっと色が薄いので判りにくいですが、これをtrueにすると行が縞々に表示されます。stripeRowsコンフィグを使わないで実装した場合、デフォルト値がfalseですので、縞々にはなりません。
height / widthはそのまま、縦・横の幅を表します。
最後のframeはこのgridの枠です。true / false で表示・非表示を表していて、デフォルトはfalseです。
コンフィグオプションをつけたり消したりして、表示を見て試してみれば判りやすいかと思います。

【Ext.data.SimpleStoreの解説】

では、GridPanelに必須コンフィグのstoreの解説です。

var store = new Ext.data.SimpleStore({
fields: [
{ name: 'a' },
{ name: 'b' }
],
data:[
[ 'hoge', 1 ],
[ 'moge', 2 ],
[ 'fuga', 3 ]
]
});

ソースは上記のようになっています。gridと同じようにExt.data.SimpleStore({ /* コンフィグオプション群 */ })コンフィグオプションを設定します。Ext.data.SimpleStoreはExt.data.Storeを継承したデータストアで、配列でStoreデータを簡単に構築できるクラスです。見ると、fieldsもdataも配列で構築されていることがわかります。

fields: [
{ name: 'a' },
{ name: 'b' }
],

fieldsは、ストア上のフィールド定義です。名前に a / b と付けてみました。gridそのものを見ると列ヘッダにtitle / numberとありますが、ストア上にあるフィールド名は a / b となります。(girdはStoreとColumnModelのファサード(ラッパー)だと理解すればいいと思います。)データを正しくマッピングできるように重複しない名前を定義してあげてください。(マッピングは次のExt.grid.ColumnModelで行います。)

data:[
[ 'hoge', 1 ],
[ 'moge', 2 ],
[ 'fuga', 3 ]
]

dataは、そのまんまデータを表していて、多次元配列(2次元配列)で定義します。表のイメージを実装してあげることが出来るので便利ですが、多次元配列で定義することに注意してください。例えば、fieldsが1つの場合でも

data:[
'hoge',
'moge',
'fuga'
]

とせずに

data:[
[ 'hoge' ],
[ 'moge' ],
[ 'fuga' ]
]

のように多次元配列で構築する必要があります。

【Ext.grid.ColumnModelの解説】

var clmnModel = new Ext.grid.ColumnModel([
{ header: "title", width: 200, dataIndex: 'a' },
{ header: "number", width: 100, sortable: true, dataIndex: 'b' }
]);

まず、ソースを抜き出してみました。このクラスは

Ext.grid.ColumnModel([{ /* コンフィグオプション群 */ },{ /* コンフィグオプション群 */ } ]);

のように、配列でコンフィグオプションをイニシャライズする必要があります。カラム定義が1つの場合は、コンフィグオプション群も1つになるかと思いますが、以下のように配列で定義しないで実装すると正しく表示されません。(gridの中身が表示されなくなります)

// 正しく表示されない
Ext.grid.ColumnModel({ /* コンフィグオプション群 */ });
// 正しく表示される
Ext.grid.ColumnModel([ { /* コンフィグオプション群 */ } ]);

コンフィグオプションの中身はその機能や、表示系のオプションがたくさん用意されていて、今回使ってみた機能はsortableというコンフィグです。読んで字のごとく該当列がソートできるか出来ないかを表すコンフィグです。デフォルト(sortableを実装していない場合)はソートできないので、titleフィールドはソート表示がグレーアウトされていて、numberフィールドはソードが出来るようになっています。

{ header: "title", width: 200, dataIndex: 'a' },
{ header: "number", width: 100, sortable: true, dataIndex: 'b' }

headerは列のタイトルとなるコンフィグで、widthは列の幅を表しています。dataIndexは上述のstoreで定義したnameとマッピングしています。必須ではありませんので定義しなくても表示されますが、明示的にマッピングして表示してあげたほうがいいかと思います。
他にもこのサンプルソースにすぐ使えそうな機能コンフィグとして以下のようなものがあります。editorというコンフィグで各セルの編集が出来るようになるのですが、これはgirdそのものがExt.grid.EditorGridPanelでないと機能しないようです。(次回解説します。)

  • hidden:Boolean
    • 列そのものを表示させるかどうかです。trueにすると非表示となります。カラムメニューから再表示させることが出来ます。
  • hideable:Boolean
    • 列を非表示に出来るかどうかです。falseにすると非表示にすることが出来なくなり、カラムメニューから該当列の表示・非表示のチェックボックスが消えます。
  • resizable:Boolean
    • 列の幅をリサイズできるかどうかです。falseにすると、リサイズが出来なくなります。
  • menuDisabled:Boolean
    • 列メニューを使えるようにするかどうかです。trueにすると、該当列の列メニュードロップダウン表示(▼←こんなの)がなくなりメニューが使えなくなります。
  • tooltip:String
    • 列にマウスをあわせたときにtooltipが表示されます。

というわけで、gridの解説をしてみました。ワタシの理解を多分に含めておりますので、誤った情報である可能性がありますのでご注意ください。

うちの妻ってどうでしょう?が面白すぎる!

うちの妻ってどうでしょう?が面白すぎる!をはてなブックマークに追加 うちの妻ってどうでしょう?が面白すぎる!をdel.icio.usに追加 Yahoo!ブックマークに登録 うちの妻ってどうでしょう?が面白すぎる!をGoogle Bookmarksに追加 うちの妻ってどうでしょう?が面白すぎる!をtwitterにポスト
2008年4月28日 月曜日
DSCF2349.jpg
「うちの妻ってどうでしょう?」著:福満しげゆきを買いました。
2chのスレで4月18日に発売だって書いてあったので、そのころ書店に行ってみたのですが、どこの書店にもなくて結局予約をしたのですが、28日発売だったんですね。昨日、予約した書店に行ってまだ入ってませんか?って聞いて、今日発売日だったと判明しました。オマエどんだけ福満好きなんだよ見たいな目で見られた。(以前も小規模な失敗を予約したので覚えられてる)

とはいえ、最高に面白いです。なんかウチの家庭とかぶるとこもあったりするので親近感が沸きます。要所〃、俺もそう思ってたー!てとこがあるんです。

・ピンキリの話
→ピンが1だということを知らなかった。

・18時とかいう言い方をやめてほしい
→福満さんと全く同じ間違え方(勘違い)をする

・視界にアメーバのような微生物が見える
→どうみてもミジンコぴんぴん現象のことです

などなど。
アクションも読むようにしようかなぁ。小規模よか面白いしなぁ。

やる夫がデザインパターンをやるようです 第12回

やる夫がデザインパターンをやるようです 第12回をはてなブックマークに追加 やる夫がデザインパターンをやるようです 第12回をdel.icio.usに追加 Yahoo!ブックマークに登録 やる夫がデザインパターンをやるようです 第12回をGoogle Bookmarksに追加 やる夫がデザインパターンをやるようです 第12回をtwitterにポスト
2008年4月28日 月曜日
   これまでお前に教えたデザインパターンは
   ・ストラテジーパターン
   ・デコレータパターン
   ・シンプルファクトリ
   ・ファクトリメソッド
   ・アブストラクトファクトリ
   ・シングルトンパターン
   と、もう6つになるな。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
   そうだお。もう6つもおぼえたお。
   飲み込みが早い新人で会社も救われてるお
   つぎのパターンを早くよこせお。
           ____
        /⌒  ⌒\
.      /( ●)  (●)\ 
     / ::::::⌒(__人__)⌒::::: \ 
    |      |r┬-|     |  
     \       `ー'´     /
    ノ            \
  /´               ヽ                 カ
 |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
     ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
  ,. - ''"| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ρ ̄`l
   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ノ ̄
  次に覚えるパターンはテンプレートメソッドというパターンだ。
  テンプレートってのはどういう意味だかわかるか?
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
  2chでスレッド立てるときに、前のスレ立て人が書き込んだ注意とか
  リンクとかいろいろ継承して使うあの「テンプレ」のことかお?
      ____
    /_ノ   ヽ_\
   /( ●) ( ●)\
 / ::::::⌒(__人__)⌒:::::\
 |        ̄      |
 \              /
  まぁそのとおりだ。
  テンプレートといえば、雛形とか定型書式とかそういうものだ。
  「テンプレートメソッド」といえばメソッドがテンプレート化されている
  ということを想像するだろう。
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
   ソウゾウシマスネー
       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |    mj |ー'´      |
  \  〈__ノ       /
    ノ  ノ
   (もう説明に飽き始めやがったな)
   今回のパターンはもう既にこれまでに何度も出てきている。
   単純に処理をテンプレート化したい場合、お前ならどうする?
   / ̄ ̄\  ( ;;;;(
 / _ノ  ヽ\ ) ;;;;)
 |  ( ●) (●)/;;/  
. |   (__人__) l;;,   
  |    ∩ ノ)━・'/  
.  |   /  ノ´ } 
.  ヽ  / /    } 
   ヽ/ /   ノ
   ソウゾウシマスネー
       ____
     /⌒  ⌒\ ホジホジ
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |    mj |ー'´      |
  \  〈__ノ       /
    ノ  ノ
   ・・・やる夫。ハナシは進んでるぞ。
   / ̄ ̄\  ( ;;;;(
 / _ノ  ヽ\ ) ;;;;)
 |  ( ○) (○)/;;/  
. |   (__人__) l;;,   
  |    ∩ ノ)━・'/  
.  |   /  ノ´ } 
.  ヽ  / /    } 
   ヽ/ /   ノ
   ソウゾウシマスネー
       ____
     /⌒  ⌒\
   /( ―)  (―)\
  /::::::⌒(__人__)⌒::::: \
  |              |
  \               /
        / ̄ ̄\
      /       \   てめぇの端末だけ外見れねぇように
      |::::::        | ネットワークチームに申請するか。。。
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
           ___   ごめんなさいごめんなさい
     ____,./      \   ごめんなさいごめんなさい
    ノ   /         \  ごめんなさいごめんなさい
  /   /            \ ごめんなさいごめんなさい
 |     |::..           ...::::|
 ヽ    `一ー――――-、;;;;::/`一ー―-、
  ヽ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
   てか、メソッドのテンプレート化なんて、
   デザインパターンというか普通に実装してりゃ
   いくらでも出てくるお。
         ____
       /      \
      /  ─    ─\
    /    (●)  (●) \
    |       (__人__)    | ________
     \      ` ⌒´   ,/ .| |          |
    ノ           \ | |          |
  /´                 | |          |
 |    l                | |          |
 ヽ    -一ー_~、⌒)^),-、   | |_________|
  ヽ ____,ノγ⌒ヽ)ニニ- ̄   | |  |
class YaruoTemplate{
final void prepareJob(){
openBrowser();
surf2ch();
surfAkibaBlog();
closeBrowser();
}
abstract void surf2ch();
}
class MyJob extends YaruoTemplate{
void surf2ch(){
System.out.println( "VIPを保守するお" );
}
}
     ____
    / ⌒  ⌒  \  これでどうかお?
  ./( ―) ( ●)  \
  /::⌒(_人_)⌒:::::  |
  |    ー       .|
  \          /
  まぁそういうことだ。prepareJobという
  仕事の準備メソッドをテンプレート化してるんだな?
  実処理はサブクラスに先送りさせているということか。
  (仕事の準備にVIPの保守すんのかてめぇは)
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
   こんなん楽勝すぎて話しになんないお。
   テンプレートメソッド(笑)だお。
          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / //
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー'´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l
 ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
   まず、
surf2ch();
surfAkibaBlog();
   はてめぇの程度の低い釣りだとして、
checkInternet();
   に変更する。そうすれば、prepareJobは
   ・ブラウザを開く
   ・ネットを調べる
   ・ブラウザを閉じる
   という処理がテンプレート化されたものと定義されるわけだ。
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
surf2ch();
surfAkibaBlog();
   はおいらの大事な大事な仕事の準備だお!
       ____
     /ノ   ヽ、_\
   /( ○)}liil{(○)\
  /    (__人__)   \
  |   ヽ |!!il|!|!l| /   |
  \    |ェェェェ|     /
   話が進まんから相手にしないが、
   基本的にはこのprepareJobをfinal指定し
   サブクラスで処理を決定する。
   テンプレートメソッドとして、これはこれで正しい。
   では、そのsurf2ch();とsurfAkibaBlog();は
   必要なときにはいつでも処理の中にサブクラスを
   フックできるようにアルゴリズムをカプセル化してみろ
   / ̄ ̄\
 /   _ノ  \
 |    ( ●)(●)
. |     (__人__)
  |     ` ⌒´ノ
.  |         }
.  ヽ        }
   ヽ     ノ
   /    く
   |     \
    |    |ヽ、二⌒)
         |
     \  __  /
     _ (m) _
        |ミ|
      /  `´  \
       ____
     /⌒  ⌒\   日本語でおk
   /( ●)  (●)\
  /::::::⌒(__人__)⌒::::: \
  |     |r┬-|     |
  \      `ー'´     /
   (その頭に浮かんだ電球みたいのはなんなんだ)
   お前は多分、
checkInternet();
   をサブクラスでオーバーライドして
surf2ch();
surfAkibaBlog();
   の処理をしようとするだろう。
   だが、そのsurf2ch();とsurfAkibaBlog();は
   restJob();(息抜き)という処理だ。
   checkInternet();ではやらずにフックして処理しろ
   といっている。
        / ̄ ̄\
      /       \
      |::::::        |
     . |:::::::::::     |
       |::::::::::::::    |          ....,:::´, .
     .  |::::::::::::::    }          ....:::,,  ..
     .  ヽ::::::::::::::    }         ,):::::::ノ .
        ヽ::::::::::  ノ        (:::::ソ: .
        /:::::::::::: く         ,ふ´..
-―――――|:::::::::::::::: \ -―,――ノ::ノ――
         |:::::::::::::::|ヽ、二⌒)━~~'´
      ___    ━┓
    / ―\   ┏┛
  /ノ  (●)\  ・
. | (●)   ⌒)\
. |   (__ノ ̄  |
  \        /
    \     _ノ
    /´     `\
     |       |
     |       |
           ___   ━┓
         / ―  \  ┏┛
        /  (●)  \ヽ ・
       /   (⌒  (●) /
       /      ̄ヽ__) /
.    /´     ___/
    |        \
    |        |
今回のパターンはテンプレートメソッドです。このパターンは、それ自体を知らない技術者も知らず知らずの内に適用してたりしますが、あわせてフックというものも学んで生きたいと思います。
次の回では、まずフックとはなにか。と、その使い方、使い分けについて記述したいと思います。

≪第11回
第13回≫