CLOVER🍀

That was when it all began.

勢いで、ScalaFXとGroovyFX

夏休み前の小ネタ、第2弾。

今日、やたら目にしたこちらを見て。

RubyGUIアプリを作るならJRuby+JavaFX+Rawrで決まり!
http://blog.supermomonga.com/articles/jruby/javafx-rawr.html

ScalaとGroovyで、JavaFXを使って同じようなことをやっていました。

あ、最初に注意事項。

  • ScalaFX、GroovyFXはおろか、JavaFXも触ったことない人が書いてます
  • あくまで、「同じ画面が出るまで」のところをやっただけで、exeファイル化とかは一切ノータッチです

とはいえ、少しだけJavaFXに興味はあったので、勢いでマネしてみました。名前を先に出しちゃいましたけど、ScalaFXとGroovyFXで。

ScalaFX
http://code.google.com/p/scalafx/

GroovyFX
http://groovyfx.org/

とりあえず、両方ともGetting Startedとかを見ながら…。

ScalaFX GettingStarted
http://code.google.com/p/scalafx/wiki/GettingStarted

GroovyFX Getting Started
http://groovyfx.org/docs/guide/gettingStarted.html

…が、わかんない。圧倒的にドキュメント不足。

まあ、Getting Startedの他にサンプルとか、リポジトリのソースとかを見ながら雰囲気で実装。あと、こちらにも軽く目を通して。

JavaFX 2 API
http://docs.oracle.com/javafx/2/api/index.html

あ、使っているJavaバージョンはこちらです。

$ java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

では、書いたコードと結果を。

ScalaFX

ビルドには、sbtを使用しました。

build.sbt

name := "scalafx-getting-started"

version := "0.0.1-SNAPSHOT"

scalaVersion := "2.10.2"

organization := "littlewings"

fork in run := true

unmanagedJars in Compile += Attributed.blank(file(System.getenv("JAVA_HOME") + "/jre/lib/jfxrt.jar"))

libraryDependencies += "org.scalafx" %% "scalafx" % "1.0.0-M4"

jfxrt.jarにunmanagedJarとしてパスを通しているところが、ポイントのようです。あと、fork in runをtrueにしておかないと、2回目以降の実行で

Caused by: java.lang.UnsatisfiedLinkError: Native Library /usr/lib/jvm/java-7-oracle/jre/lib/amd64/libglass.so already loaded in another classloader

みたいなことを言われて、コケてくれます。

コード本体。
src/main/scala/ScalaFXGettingStarted.scala

import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.web.WebView

object ScalaFXGettingStarted extends JFXApp {
  val browser: WebView = new WebView
  browser.engine.load("http://google.com")

  stage = new JFXApp.PrimaryStage {
    title = "Hello ScalaFX"
    width = 800
    height = 600
    scene = new Scene {
      root = browser
    }
  }
}

実行。

> run
[info] Running ScalaFXGettingStarted

出ましたよー。

GroovyFX

続いて、GroovyFX。こちらは、Grapeを使用しました。

groovyfx-getting-started.groovy

@Grab('org.codehaus.groovyfx:groovyfx:0.3.1')
import static groovyx.javafx.GroovyFX.start

start {
    stage(title: 'Hello GroovyFX', visible: true) {
        scene(width: 800, height: 600) {
            wv = webView()
        }
    }

    wv.engine.load('http://google.com/')
}

短っ!!

実行には、こちらもjfxrt.jarが必要なのですが、ここは普通にcpオプションで付けました。

$ groovy -cp $JAVA_HOME/jre/lib/jfxrt.jar groovyfx-getting-started.groovy

結果。

出ましたよー。

なんですけど、ScalaFXとGroovyFXで同じheightを指定してるんですけど、なんかGroovyFXの方がちょっと大きいんですけど…ScalaFXが小さいのかどうかはわかりませんが。

とりあえず、動かせたからいいかな?

両方とも、APIリファレンスくらいないものかなぁ…。