JavaFXユーザグループ第6回勉強会に行って来ました

前回に引き続き第6回JavaFX勉強会に参加してきましたので、その時のメモを貼っておきます。色々あって公開が遅くなっちゃいました。
今回は参加者が随分増えていて驚きました。やはりJavaOneOracleJavaFXを全面に押し出したことや、GroovyやScalaの話題があったからでしょうか。

何が変わった JavaFX 2.0 by 櫻庭さん (@skrb)

JavaOneでの話題や、正式版となったJavaFX2.0についての説明が中心でした。

JavaOneでのお話し
  • 今回のJavaOneではJavaSE、EE、MEそれぞれで大きな動きがあった。
  • Java8ではJavaFX3.0がSwing/AWTに代わる立場に。
    • その前に多分JavaFX2.1が来る。
    • 現時点ではまだJavaSEに入る水準に達していない。
  • JavaMEの変化がサブライズ。
    • CDCとSE Embeddedが一緒になった。
      • JavaMEは10年前の規格で、その時に比べると携帯端末の性能は大幅に上がっているし。
    • NandiniさんがiPadでデモ! (JavaFXが動いた!)
      • もちろん実際に載せられるようになるかは政治的な話もあるので...
JavaFX2.0で変わったこと

前回のご説明とかぶっている内容も結構あったので、差分点を中心にメモっています。

  • シーングラフをJavaで書くのは辛いので、XMLでも書けるようにした。それがFXML。
  • Production Suiteなくなっちゃった!
    • Adobe製品からの取り込みができなくなった。
    • SVG経由で取り込むようなライブラリを自作した。(後日公開するとのことです)
  • JSONのParserがなくなっちゃった。JavaEE7にも入るので、まとめようとしているのかな?
デモ

テキストエリアに入れたコードをその場で解釈して実装するアプリを使ってデモしていました。

  • WebView
    • HTML文字列の解釈もOK。
    • この上でHTML5で作っても大抵のアプリは提供できちゃいますね。(身も蓋もないこと言いますねw)
    • 純粋な意味でのHTML5CSSJavaScriptは大体OK。WebSocketなど幾つか使えない仕様もある。
  • アニメーション
    • 移動とか回転だったら始点と終点を指定するだけで後は自動補完する。
    • 移動、回転、拡大縮小、パスアニメーションとかができる。
  • Effect
    • 基本 Node に対して setEffect する。
    • 徐々に効果を掛ける時はタイムラインを作って少しずつ変えていく。
  • CSS
    • Scene に対して add する。つまり複数指定がOK。
    • 接頭辞 "-fx" が付く。
  • Bind
    • オブジェクト間のプロパティの結びつけ。
    • MVCGUIを構築する場合、MからVに対してはオブザーバー同期を行うが、これは実装がめんどくさい。それを解決するのがBind。
    • 高レベルAPI、低レベルAPIがあり、パフォーマンスを出したかったら低レベルAPIを使う。
まとめとか
  • OpenJDKに入ることに。OpenJFXという昔聞いたような名前でw
  • ツールとしてはNetBeansに加えて、Scene Builderが発表された。
    • ただしこれはFlashで言えばFlash Builderのようなもので、デザイナ向きではない。
  • 次のバージョンは多分2.1。もしかしたら3かも。その前にJavaSE7対応ということで2.01が出そう。
質疑応答

Q. まだJavaSEに組み込める水準ではないとは?
A. まだ意図した動きがしない所があるとか、Prismが対応しているGPUがまだ少ない所とか。
Q. CSSの属性名に何で接頭辞が入っている?
A. 何ででしょう、困りますよねえ (爆
Q. FXMLには日本語が使えるか?
A. XMLなのでたぶん大丈夫なはず。
(これは私がコメント) 自分が試してみたところ、属性では普通に使えましたよー。
※こんな感じで試してました。

<VBox id="boxPane" prefHeight="200" prefWidth="320" spacing="10"
    xmlns:fx="http://javafx.com/fxml" fx:controller="samplefxmlapplication.Sample">
    <children>
        <Button id="button" prefWidth="80" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
        <Label
            id="label" prefHeight="16" prefWidth="200"
            text="クリックしたら表示が変わるよ" fx:id="label">
            <alignment>
                <Pos fx:value="CENTER"/>
            </alignment>
        </Label>
    </children>
    <alignment>
        <Pos fx:value="CENTER"/>
    </alignment>
</VBox>

Q. コンパイルはどのように行うのか?FXMLは?
A. 普通にJavaアプリケーションとしてビルドする。FXMLはJavaプログラム中でロード処理を書く。(デコンパイルしたら中でStAXを使ってた)
Q. bindを入力チェックとかに応用できるか?
A. 低レベルAPIを使えば割と好きに書けるのでいけます。
Q. CSSのリファレンスが見当たらなかったのですが。(<- 質問者私です)
A. OracleのJavaFXのページからリンクがありますよ。

すみません、めっちゃ正面玄関にありましたね!失礼しましたー。
Q. Swingとの混在はやりやすい?
A. スレッドが別になるのでやりにくい。また、Swing上でJavaFXを動かすとJava2D上で動くことになるので遅くなる。

感想

JavaOneではJavaFXが全面に押し出されていて、自分も結構驚きました。ただ、現時点ではJavaSE本体に入るレベルじゃないというのは分かります。AWT/Swingと決別して一から作り直しているので、AWT/Swingが長い時間を掛けて蓄積してきた資産がそのままでは使えないですからねえ。自分でいじっている時でもグローバルなマウス位置が取れなくて面食らったりとか*1、まだまだ不足しているところはあるという印象です。
FXMLは結構面白いと思っています。XML側とJavaコード側を結びつける仕組みがMXML等の類似技術よりも良く考えられているという印象です。
MXMLコンパイルするとActionScriptクラスに変換されますが、FXMLはあくまでXMLドキュメントのまま読み込む形になっているのもちょっと変わっていますね。この方法が本当にいいのかは分からないですが...。

GroovyFX – Groovy な JavaFX 2.0 by 関谷さん (@kazuchika)

「プログラミングGROOVY」の共著者でもある関谷さんから、GroovyFXについて、デモアプリケーションと共に紹介して頂きました。デモアプリケーションが素晴らしかったです。

Groovyとは?
  • 書いたことある人?
    • (会場の半分くらいでした。すみません、実は自分もこれまでGroovyと接する機会がありませんでした...)
  • JVM上で動くスクリプト言語の中でも、特にJava共生するという姿勢がある言語。
    • 文法的に近いし、ツールや文化も近い。
GroovyFX
  • JavaFXをより簡単に書けるようにラップしている。
  • まだアルファ段階で、SVNから落として自分でビルドする必要がある。
  • Groovyのビルダーを活用したDSLを提供する。宣言的にシーングラフやタイムラインを構築できる。
  • ビルダーとは?
    • Groovyの柔軟な言語仕様をフル活用して、オブジェクトを構築する仕組み。
    • HTMLとかSwingやAnt、CLIに対応したビルダーがある。
  • 様々なシンタックスシュガーを提供。
    • Duarationを100.msとか5.sと書ける。(Numberにモンキーパッチでメソッドを増やしている)
    • 擬似定数の提供。
    • 属性値の自動型変換でFontやPoint3Dの値をリテラルで書くことができる。
デモアプリケーション
  • Google+のプロフィールを取ってくるアプリ。
    • クロージャの中で構造だけでなく、effectの設定とかも書き下せる。
    • ParallelTransitionがすごく見通しよく書ける。
  • WebViewのデモ。
    • HTML5Canvasを使ってグラフィック生成。JavaScriptコードも連動している!
    • Twitter4Jを使って、ハッシュタグ付きのつぶやきを拾って、Canvasにサウンドと共に表示するデモが見事!
    • 非同期処理も綺麗に書ける印象。
その他
  • バインディングは現在見直しが入っているとのこと。
  • Griffonフレームワークと連携する計画が。MVCベースのフレームワークになる模様。
  • プレゼンテーションツールPreziのGroovyFX版である、Greziというものも開発されているとのこと。
  • 12/1 に JavaDeveloper Workshop を開催します!
    • Nandiniさんが来るとのこと!
感想

Groovy、意外とこれまで触る機会がなかったのですが、いいですねえ。Javaを補佐する便利な小道具という感じで。
GroovyFXでUI構造を記述すると、見通しはFXMLよりもずっといいですね。あとは見直し中というバインディングの部分がどうなるのか、注目しています。

JavaFX 2.0 + Scala → ScalaFX by 深井さん (@fukai_yas)

こちらはScalaFXの紹介です。深井さんはScalaは業務ではなく趣味で触っているとのことでした。
ScalaFXはまだまだ始まったばかりの状態のようですが、こちらはこちらでとても興味深いものがありました。

ScalaFXの概要
  • JavaFXの各クラスにラッパーを提供する。
  • Scalaの柔軟な文法をフルに活用している。
  • まだ現時点では未実装なものが多く、これからといったところ。
  • そのままではAppletやWebStartアプリケーションを作ることができない。
シーングラフの構築
  • ぱっと見はGroovyFXと同様、JavaFXScriptに似せた書き方になっている。
    • プロパティを組み立てている所が少し違う。"foo_=" というsetterメソッドが "foo = " と呼び出せるというScalaシンタックスシュガーを利用している。
  • JFXAppがmainメソッド起動前提なのでAppletがNG。
    • Appletで使いたかったらJavaFXのApplicationを直接使う。
  • バインドは次のように書く。複雑な処理も書ける。
        new Rectangle {
          width <== stage.widthProperty / 2
          height <== stage.heightProperty / 2
          fill <== when (checkbox.selected) then Color.RED otherwise Color.BLUE
        }

何これ、めっちゃクールなんですけど!
※同じ事をJavaで書くと次のようになります。分かりやすさが全然違いますよね!

        Rectangle rect = new Rectangle();
        rect.widthProperty().bind(stage.widthProperty().divide(2));
        rect.heightProperty().bind(stage.heightProperty().divide(2));
        rect.fillProperty().bind(new ObjectBinding<Color>() {
            {
                super.bind(checkbox.selectedProperty());
            }
            @Override
            protected Color computeValue() {
                return checkbox.selectedProperty().getValue() ? Color.RED : Color.BLUE;
            }
        });
  • GroovyFXと同様、Duarationとかを書きやすくするようにしている。
まとめ
  • Scalaの特徴をフルに活かしたDSL
    • Scalaの勉強にもなるので是非!
  • まだまだ始まったばかりのプロダクト。
感想

こちらはこちらでScalaの機能をフルに活かして、見通しのいいDSLを提供しているな、と思いました。バインドの記述が実にいいです!
個人的にはScalaは勉強を始めた所という段階なのですが、そうか、これをネタに勉強すればいいのか。

その他

  • 次回は来年1月くらいに。ツールをメインテーマに!

全体を通しての感想

冒頭にも書きましたが参加者が増えて驚きました。懇親会でも様々なバックグラウンドを持つ人が集まってきているという印象でした。JavaEE系の人とかAndroidの人とか自分みたいにHadoop触っている人とかw
少しずつ盛り上がり始めているのは確かだと思っています。別のエントリでも書きましたが、Flexがあんなことになったので、実は今JavaFXは結構いい立ち位置にあるのかも知れません。

*1:これについては別途エントリを書こうと思っています。