NetBeans + Gradle で JavaFX 開発を始めてみる

今日は大雪だというので多分電車も止まるだろうとばっちり休むつもりでいたら、たいして雪もふらず電車も止まってなかったけど休んだ。

というわけで暇だったので NetBeans + Gradle で JavaFX 開発でもやってみようとあれこれ試行錯誤したメモ。とりあえず画面出すまで。変なとこあったらぜひ教えていただきたい。

環境

Gradle インストール

gradle でぐぐって出てきたやつを入れる。インストールフォルダ\bin を環境変数 path に追加しておく。

NetBeansプラグイン追加

NetBeans の Gradle サポートを入れる。 NB のツール -> プラグイン -> 使用可能なプラグインから、検索で gradle と入れて出てきた奴をインストールすればいい。

ツール -> オプション -> その他 -> Gradle の Gradle Installation Directory に Gradle のインストールフォルダを設定する。これは bin は含めなくていい。

今回は触れないけど、 GroovyFX にするなら Groovy プラグインを入れておくといいと思う。 GroovyFX については以下の記事が詳しい。

プロジェクト作成

NB の新規プロジェクトから Gradle -> Single Gradle Project を選択して作成。ここで Main Class を指定しないと NB が例外ふいたので適当に指定しておく。

build.gradle の変更

gradle で JavaFX アプリケーションをビルドするために、 javafx-gradle を使う。

build.gradle に以下を追記して読み込む。

//apply from: 'http://dl.bintray.com/content/shemnon/javafx-gradle/javafx.plugin'
apply from: 'http://dl.bintray.com/content/shemnon/javafx-gradle/0.3.0/javafx.plugin'
2013/07/27 URL 修正

javafx-gradle の URL はしばしば変更されるようです。開発者のブログなどで必ず最新の情報を参照するようにしてください。

続いて、Main Class の指定方法を以下の通り変更。

// NB が生成したひな形に以下のような指定があるが、これを消して、
//if (!hasProperty('mainClass')) {
//    ext.mainClass = 'foo.Main'
//}

// こんな感じにする
javafx {
    mainClass = 'foo.Main'
}

これで NB から実行( Run )するとめでたく BUILD SUCCESSFUL となる。

この状態でコマンドプロンプトから gradle build するとビルド通るんだけど、 NB から Build するとエラーになる。

Build failure: gradle build
org.gradle.tooling.BuildException: Could not execute build using Gradle installation 'D:\opt\gradle\gradle-1.4'.
	at org.gradle.tooling.internal.consumer.ResultHandlerAdapter.onFailure(ResultHandlerAdapter.java:53)
	at org.gradle.tooling.internal.consumer.async.DefaultAsyncConnection$3.run(DefaultAsyncConnection.java:81)
	at org.gradle.messaging.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:66)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)
Caused by: org.gradle.api.internal.LocationAwareException: Execution failed for task ':jfxJar'.
(略)
Caused by: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':jfxJar'.
(略)
Caused by: com.sun.javafx.tools.packager.PackagerException: エラー: jarファイルJavaFxGradle.jarの作成に失敗しました
(略)
Caused by: java.io.FileNotFoundException: Input folder does not exist [C:\Program Files\NetBeans 7.2.1\build\jdk7Compat\JavaFxGradle.jar]

これはよくわからない。

2013/07/27 追記

NetBeans7.3.1 上で試したところ、 javafx-gradle の 0.3.0 では上記エラーは再現しなくなっています。

Main の変更

このままでは Main クラスが JavaFX でもなんでもないただの Main クラスなので当然 Run しても何も起きない。 JavaFX のエントリポイントになるように Main を実装する必要がある。 JavaFX のエントリポイントといえば javafx.application.Application ですね。

というわけでおもむろに Main クラスに extends Application しようとしてもなぜか import が見つからない。そんな時は慌てずに落ち着いてプロジェクト右クリック -> Reload Project すればいい。 Dependencies/Compile の下に jfxrt.jar が見えていれば大丈夫。

あとは Application の抽象メソッドを実装して*1 Run すればめでたく JavaFX アプリケーションが起動してくるはず。

あとは普通に開発していけばいい。 FXML とかも問題なく使える。わざわざこんなことせずに NetBeansJavaFX テンプレート使えば画面出すのなんて 1 分かからないけどな・・・。

Scene Builder について

JavaFX の画面レイアウト( FXML )を編集するための Scene Builder 、初めて使ってみた。 NetBeans 入れたら勝手に入ってくるんだとなぜか思い込んでたけど、別途インストールが必要なのね。しかも JDK だけ入れて JRE 入れてなかったらインストールすら出来なかった。

FXML を手で編集するとか苦行すぎると思うのでこのツールは助かる。ただなんか onAction の設定あたりの動きが怪しい気がするなあ。メソッド名が途中までしか FXML に反映されないとか。まだまだ発展途上ということか。

難しいかもしれんけど早く NetBeans に統合されるといいのにな。 IDEGUI 編集ツールが含まれてないってよく考えたらかなり異次元よね。

Scene Builder は UI 綺麗だけど JavaFX で作られてるのかな。 NetBeansJavaFX 化するのは何時の日か・・。

余談

NetBeans って Eclipse と違ってソースフォルダ( src/main/java )のパスが表示されないのな。 GroovyFX もちょっとためそうと思ったんだけど、この src/main/java のパスを変更する方法がわからなかった*2。めんどくさくなったので、 NetBeans 外でフォルダ名を java -> groovy にして Reload Project したら変更することができた。

@mike_neck さんによるとこういう方法もあるようだ。

なお、 src/main/java と src/main/groovy を両方用意しとくと、 NetBeans からは Source Packages が2つ見えるようになり、中身が空だとどっちがどっちかわからなくなるw

*1:面倒だったら JavaFX プロジェクトのテンプレートからコピペしてきてもいい。 launch の呼び出しを忘れずに。

*2:Main クラスが Groovy の場合、 src/main/groovy に置かないと認識されない。