夏休み前の小ネタ、第2弾。
今日、やたら目にしたこちらを見て。
RubyでGUIアプリを作るなら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 -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リファレンスくらいないものかなぁ…。