Griffonとは
今回はGrailsと同様の使い勝手でデスクトップアプリケーションを構築することができる「Griffon 」を紹介します。Grails は、JVM言語Groovyを使って、Ruby on RailsのようにコマンドラインベースでWebアプリケーションを構築することができるフレームです。Griffonはその使用感をデスクトップアプリケーションの開発に適用したフレームワークで、簡単なコマンドでMVC準拠のアプリケーションを構築・実行することができます。
Griffonの主な特徴としては、次のような項目が挙げられます。
シンプルなコードでMVCアプリケーションを実現できる
JavaおよびGroovyの資産が利用できる
各種Groovy Builder が適用できる
プラグイン による拡張が可能
AppletやJava Web Startで公開可能なパッケージ生成機能を備えている
GriffonはGroovyで作られたフレームワークであり、開発の基本となる言語も当然Groovyですが、GroovyからはJavaライブラリを呼び出すことができるため、Swingを含めてJavaが持つ豊富な機能をそのまま利用することが可能です。
Griffonによるアプリケーションの作成と実行
Griffonはこのページ よりダウンロードできます。本稿執筆時点の最新版はGriffon 0.9.5です。バイナリをダウンロードしたら、インストールしたい場所に解凍してください。
解凍した先のパス("C:\griffon-0.9.5"など)を、環境変数GRIFFON_HOMEに設定します。そして環境変数PATHに、"%GRIFFON_HOME%\bin"を追加します。初期設定はこれだけです。コマンドプロンプトを開いて、任意の場所で「griffon」コマンドを実行してください。必要なライブラリなどが読み込まれて、Griffonによるアプリケーション開発ができるようになります。
C:\work\griffon> griffon
Welcome to Griffon 0.9.5 - http://griffon.codehaus.org/
Licensed under Apache Standard License 2.0
Griffon home is set to: C:\work\tools\griffon-0.9.5
…
アプリケーションの作成は、「 griffon create-app」コマンドで行います。次の例は、「 GriffonSample」というアプリケーションを作成するものです。
C:\work\griffon> griffon create-app GriffonSample
成功すると、GriffonSampleという名前のフォルダが生成され、その下に必要な雛形ファイルがコピーされます。GriffonSampleフォルダの構成は図1 のようになっています。
図1 作成したアプリケーションのフォルダ構成
このうち、モデルを実装するコードはmodelsフォルダに、コントローラを実装するコードはcontrollersフォルダに、ビューを実装するコードはiviewsフォルダに配置することになります。
初期状態ですでに実行可能な形になっているはずなので、まずはそのまま実行してみましょう。GriffonSampleフォルダに移動して、「 griffon run-app」コマンドで次のように実行します。
C:\work\griffon> cd GriffonSample
C:\work\griffon\GriffonSample> griffon run-app
正しく実行されれば、図2 のようなウィンドウが表示されるはずです。
図2 GriffonSampleの実行例(初期状態)
モデル/ビュー/コントロールのカスタマイズ
続いて、モデル、ビュー、コントロールの各コードを修正してみましょう。まずモデルについては、modelsフォルダのGriffonSampleModel.groovyが対象のコードになります。ここでは、次のようにプロパティとして"name"と"message"の2つの値を設定しました。@Bindableアノテーションは、ビューとのバインドを許可するためのものです。
package griffonsample
import groovy.beans.Bindable
class GriffonSampleModel {
@Bindable String name
@Bindable String message = "Hello Griffon!"
}
ビューのコードはviewsフォルダのGriffonSampleView.groovyです。ここでは、テキストフィールドに名前を入力し、下部にメッセージを表示するようなUIを作成しました。ボタンを押すとコントローラのsubmitメソッドが実行されます。
package griffonsample
application(title: 'GriffonSample',
preferredSize: [320, 180],
pack: true,
locationByPlatform:true,
iconImage: imageIcon('/griffon-icon-48x48.png').image,
iconImages: [imageIcon('/griffon-icon-48x48.png').image,
imageIcon('/griffon-icon-32x32.png').image,
imageIcon('/griffon-icon-16x16.png').image]) {
// add content here
borderLayout()
panel(constraints: CENTER, border: emptyBorder(6)) {
borderLayout()
textField(columns: 20,
border: titledBorder('名前'),
text: bind(target: model, targetProperty: 'name'), // nameプロパティとバインド
constraints: CENTER)
button('Submit',
actionPerformed: controller.&submit,
constraints: SOUTH)
}
label(text: bind {model.message}, // messageプロパティとバインド
border: titledBorder('メッセージ'),
constraints: SOUTH)
}
テキストフィールドの値はモデルのnameプロパティと関連付けるようにします。それには、bind()メソッドを使って、targetにモデルを表すmodelを、targetPropertyにバインド対象のプロパティ名である'name'を渡します。同様に、ラベルの値はモデルのmessageプロパティにバインドさせます。こちらはtextプロパティの値に「bind {model.message}」を指定することで、モデルのmessageプロパティの値がセットされます。
コントローラのコードはcontrollersフォルダのGriffonSampleController.groovyです。今回は、nameプロパティの値を使って作成した文字列を、messageプロパティにセットするようにしました。
package griffonsample
class GriffonSampleController {
// these will be injected by Griffon
def model
def view
def submit = { evt = null ->
model.message = 'Hello ' + model.name + '!'
}
}
修正が完了したら、再度griffon run-appコマンドで実行してみましょう。図3、図4 に実行例を示します。名前を入力して[Submit]ボタンを押すと、下部に入力値が反映されることが確認できるはずです。
図3 GriffonSampleの実行例(修正後)
図4 GriffonSampleの実行例(修正後)
Griffonで雛形を生成すれば、深く考えなくても自然とMVC形式のアプリケーションになる点が大きなメリットだと思います。GroovyはJavaとの親和性が極めて高いので、Groovyに慣れていない開発者でも、比較的容易に使いこなすことができるはずです。