先週までは、Rhinoスクリプトエンジンを使用してJavaScriptを扱ってきました。今週と来週は、JavaScript以外のスクリプト言語を組み込んで、使用してみます。

JSR 223に対応したスクリプトエンジンの情報はjava.netのScriptingプロジェクトに集約されています。表1にScriptiningプロジェクトに取りあげられているスクリプト言語とその処理系を示しました。

表1の中にはJRubyやJythonのように、単体ではJSR 223に対応しておらず、Scriptingプロジェクトが公開しているスクリプトエンジンを別途インストールするものや、JavaFX ScriptのようにはじめからJSR 223対応スクリプトエンジンが含まれているものがあります。

また、PHP-Javaブリッジのようにネイティブのスクリプト言語処理系に対するブリッジから構成されるものもあります。

今週はスクリプト言語処理系にJSR 223対応スクリプトエンジンが含まれているJavaFX Scriptを取りあげます。来週は、ScriptingプロジェクトでJSR 223対応スクリプトエンジンを公開しているJRubyを取りあげる予定です。

表1 JSR 223に対応したスクリプト言語
  言語 実装
Scriptingプロジェクトによる
スクリプトエンジン
AWK Jawk 0.14
BeanShell BeanShell 2.0b5
ejs (Embedded JavaScript)  
FreeMarker FreeMarker 2.3.11
Groovy Groovy 1.5.1
Jaskell Jaskell 1.0
Java Java Compiler API (JSR 199)
JavaScript Rhino 1.6R7
JavaScript (Web Browser) Web Browser's native JS
Jelly Jelly 1.0
JEP JEP (Java Math Expression Parser) 2.4.0
Jexl Jexl 1.0
jst (JavaScript Templates) TrimPath JavaScript Templates 1.0.38
JudoScript JudoScript 0.9
JUEL JUEL 2.1.0-rc2
OGNL OGNL 2.6.9
Pnuts Pnuts 1.1
Python Jython 2.2.1
Ruby JRuby 1.0
Scheme SISC 1.16.6
Sleep Sleep 2.0
Tcl Jad 1.3.3
Velocity Velocity 1.5
XPath JDK 6.0
XSLT JDK 6.0
その他 JavaFX Script OpenJFX
AppleScript jasconn (Java-AppleScript-Connector))
Bex Bex 1.2
OCaml OCamlScripting 1.0-alpha
PHP Quercus
PHP (native) PHP/Java Bridge 3.2.1
Python (native) Jepp 2.3
Smalltalk Athena 0.1

 

JavaFXをJava SE 6から扱う

JavaFXは、Javaをベースにした新しいプラットフォームであり、ユーザインタフェースを効率よく開発することを目的としています。

このJavaFXの中核となるのがGUIに特化したスクリプト言語であるJavaFX Scriptです。

JavaFXはデスクトップシステムから携帯電話などの組み込み用途まで幅広くカバーしており、アプレットやJava Web Startでも動作させることができます。いずれの場合も、JavaFX Scriptによってユーザインタフェースを構築します。

JavaFXは昨年のJavaOneで発表され、筆者もJavaOneレポートで紹介しました。

このJavaFX ScriptをJava SE 6から扱ってみましょう。

まずはインストールから行ないます。JavaFXの処理系は、java.netのOpenJFXプロジェクトで公開されています。ダウンロードはダウンロードページソースコードの項目から行ないます。

スクリプトエンジンのダウンロードにはSubversionを使用する方法と、ZIPファイルもしくはtar.gzファイルを使用する方法の2種類があります。ここではWindows Vista上で扱いやすいようにZIPファイルを使用しました。

ダウンロードの項目の「tar.gzもしくはzipファイル」をクリックして、ダウンロードページに進みます。原稿執筆時点(2008年2月)では、OpenJFX-200710081507.zipが最新のファイルです。このファイルをダウンロードし、適当な場所に展開します。

展開するとtrunkやtagsといったディレクトリが作成されます。ようはSubversionのディレクトリ構成をそのまま圧縮しただけということが分かりますね。

それはそれとして、JavaFX Scriptの本体はtrunk/lib/javafxrt.jarファイルになります。このJARファイルの中にJSR 223対応のスクリプトエンジンも含まれています。JavaFX Scriptの実行には、javafxrt.jarファイル以外に、Filter.jarファイルとswing-layout.jarファイルもクラスパスに指定します。

ここでは、ZIPファイルをC:\openjfxに展開しました。したがって、javafxrt.jarファイル等はC:\openjfx\trunk\libディレクトリにあります。

それでは、まずJavaFX Scriptのスクリプトを作成しましょう。JavaFX Scriptのファイル拡張子はfxになります。

サンプルのソース ClickMe.fx
FXLauncher.java

このスクリプトはフレームを作成して、ボタンを貼るという簡単なものです。

import javafx.ui.*;
import java.lang.*;
 
var frame = Frame {
    var: frame
    title: "Click Me!"
    width: 180
    height: 80
    visible: true
 
    // クローズボタンをクリックされたときの処理
    onClose: operation() {
        frame.dispose = true;
    }
 
    // フレームに貼るコンテンツ
    content: Button {
        // ボタンに表示する文字列
        // HTMLが使用可
        text: "<html><h3>Click Me!</h3></html>"
 
        // ボタンがクリックされたときの処理
        action: operation() {
            System.out.println("Clicked!!!");
        }
    }
};

一見すると、JavaScriptのオブジェクトリテラル形式もしくはCSSのような感じですね。この表記の方法が宣言的文法と呼ばれるものです。Javaの手続き的な記述とはずいぶん異なることが分かります。

ここでは、JavaFX Scriptの文法を詳細に解説することはしませんが、簡単に解説しましょう。

JavaFX Scriptは、クラス名 { } でオブジェクトを生成します。大カッコの内部で、アトリビュートに値を代入します。

赤字で示したvar: frameだけは特殊な表記で、自分自身をframeという変数で表すことを意味しています。Javaでいうところの、thisに相当するものです。

フレームに貼るボタンを表しているのが青字の部分です。contentアトリビュートにButtonオブジェクトを生成して、代入しています。

JavaFXのButtonやLabelなどの文字列を扱うクラスは、Swingと同様にHTMLを扱うことが可能です。また、ボタンがクリックされたときの処理はactionアトリビュートで表されます。ここでは標準出力に文字を出力するオペレーションを定義して、代入しています。