本格派エンジニアの工具箱

第31回Grailsライクにデスクトップアプリケーションを構築する「Griffon」

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 作成したアプリケーションのフォルダ構成
図1 作成したアプリケーションのフォルダ構成

このうち、モデルを実装するコードはmodelsフォルダに、コントローラを実装するコードはcontrollersフォルダに、ビューを実装するコードはiviewsフォルダに配置することになります。

初期状態ですでに実行可能な形になっているはずなので、まずはそのまま実行してみましょう。GriffonSampleフォルダに移動して、⁠griffon run-app」コマンドで次のように実行します。

C:\work\griffon> cd GriffonSample
C:\work\griffon\GriffonSample> griffon run-app

正しく実行されれば、図2のようなウィンドウが表示されるはずです。

図2 GriffonSampleの実行例(初期状態)
図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の実行例(修正後)
図3 GriffonSampleの実行例(修正後)
図4 GriffonSampleの実行例(修正後)
図4 GriffonSampleの実行例(修正後)

Griffonで雛形を生成すれば、深く考えなくても自然とMVC形式のアプリケーションになる点が大きなメリットだと思います。GroovyはJavaとの親和性が極めて高いので、Groovyに慣れていない開発者でも、比較的容易に使いこなすことができるはずです。

おすすめ記事

記事・ニュース一覧