MVC Groupの切り替えを分かった気になってやってみた。
元ネタはこちら。→ http://griffon.codehaus.org/FileViewer
Griffonは,MVCの組み合わせを複数持てるんだけど,あるMVCグループから別のMVCグループを生成するってのを試してみた。
スクリーンショットで見ると(↓)こんな感じに,JFrameを持つ大元の画面から,あるイベント(リストをダブルクリック)を起こすと,タブが増えていくってのを作ってみた。
大元の画面ってのと増えてくタブ(赤枠部分)ってのは,別々のMVCグループになってんのね。
#何作ろうとしているかは,ナイショだ。:-)
叩いたGriffonのコマンドはこれだけ。
> griffon create-app MvcApp > cd MvcApp > griffon create-mvc DetailPanel
これで,それぞれMvcApp,DetailPanelという接頭子を持つMVCの組み合わせができる。その定義情報は,$APP_HOME/griffon-app/conf/Application.groovy に記述される。
application { title='MvcApp' startupGroups = ['MvcApp'] } mvcGroups { // MVC Group for "DetailPanel" DetailPanel { model = 'DetailPanelModel' view = 'DetailPanelView' controller = 'DetailPanelController' } // MVC Group for "Mvcapp" MvcApp { model = 'MvcAppModel' view = 'MvcAppView' controller = 'MvcAppController' } }
create-app
で作成したMVCグループが,application/startupGroupsに指定されてるんで,Griffonを実行(run-app
)するとそのMVCグループが動くワケだな。
で,肝心のMVCグループの切り替え(つうか作成?)はどうするかっていうと,こうする。
#全部のコードはうしろのほうに載せとく。
= MvcAppController.groovyの一部抜粋 = def listClickedListener = { evt -> : createMVCGroup('DetailPanel', item, [rootPane:view.tab, item:item]) } }
createMVCGroup()
の引数はこんな感じ。
- 新しく作るMVCグループの名前(Application.groovyに登録してある名前を指定)。
- MVCグループのインスタンス名
- ユニーク名がいいかどうかは用途次第
- 指定した名前を使って,
app.controllers.名前, app.models.名前, app.views.名前
でそれぞれの要素の直接アクセスすることもできるそうだ。
- 指定したMVCグループに渡す引数
createMVCGroup()
が呼び出されると,指定したMVCグループのコントローラのmvcGroupInit(Map)
が呼び出される。もちっと具体的に言うと,こうだった。
MvcAppController createMVCGroup() ---> 1.new DetailPanelModel() 2.DetailPanelController.mvcGroupInit(Map) 3.DetailPanelView.build()
DetailPanelControllerのmvcGroupInit(Map)
は,引数にMapを受け取るので連携が分かりやすいが,どうもこのMapの値,DetailPanelViewにも渡るみたいだった。
実際,DetailPanelViewのコード見るとわかるけど,変数:rootPane
やitem
はMvcAppControllerから渡ってきたものだ。
= DetailPanelView.groovyの一部抜粋 =
tabbedPane(id:'tab', rootPane, selectedIndex:rootPane.tabCount) {
panel(title:item) {
borderLayout()
:
「わーい,これでMVCグループの切り替えもバッチリだ」とよろこんでみたものの幾つか謎が残る。
あと一番最初の動くコントローラの初期化処理はどこでやるのが正しいんだろか?一応,MvcAppControllerにもmvcGroupInit(Map)
があるから,そこに書いてみたけど,こんな例を良く見かける。
$APP_HOME/griffon-app/lifecycle/Startup.groovyに,
app.controllers.MvcApp.loadPages()
みたいに書いて,MvcAppControllerにloadPages()
を定義する。
= MvcAppController.groovyの一部抜粋 = void loadPages() { // 初期化処理を書くぞー : }
まあ,Griffonもまだ0.1Betaだかんね。ここら辺の記述がこなれるには,もちょっとかかるんだろうな。
でも慣れてくるとスゴく気軽にGUI作れて,良い感じよ。>Griffon