AndroidでJavaFXを動かしてみたよ!
この記事は JavaFX Advent Calendar 2014 23 日目の記事です。
JavaFX Advent Calendar 2014 - Adventar
JavaFXはSwingに代わるJavaの新たなクライアントサイド技術です。そして現在のクライアントサイドの主流端末はタブレットですね。
そこで、JavaFXをタブレット上で動かすことに挑戦しました!
JavaFXをAndroidで動かす為に使用した技術は『JavaFXPorts』です。
http://javafxports.org/page/home
『The true spirit of Write Once, Run Anywhere.』
とサイトに記載があるように、JavaFXをAndroidやiOSで動かせるようにするのが目標のようです。
JavaFXPortsの詳細は、「What is JavaFXPorts?」をご覧ください。
動作方法は、「Getting Started」に書かれています*1。
- JavaFXアプリケーションはjar にビルドされます。ビルドされたアプリケーションはJava7、もしくはJava6のクラスフォーマットである必要があります。
- 依存する全てのライブラリは同じディレクトリに配置する必要があり、Java 6/7クラスである必要があります。
- Android SDK が必要です。
http://developer.android.com/sdk/index.html#download - JavaFXPortsでは、Android Gradle pluginを使用します。APIバージョンは最新の21で、ビルドツールは21.1.1です*2。
- JavaFX Dalvik SDKをダウンロードしましょう。
https://bitbucket.org/javafxports/android/downloads
僕が検証に使用したのは、本日時点で最新の「dalvik-sdk-8u40-ea3.zip」です。
開発端末はMBPを用いました。
環境によりますが、動作するまでには色々なエラーを踏むと思います。まずは、ダウンロードしたdalvik-sdkにある、samplesのHelloWorldを動かすのを目標にしましょう。
ダウンロードしたDalvik JavaFX SDKとAndroid SDKのパスをlocal.propertiesに記述してあげれば、それで準備OKです。
(例)
sdk.dir=/Applications/adt-bundle-mac-x86_64-20140702/sdk
javafx.dir=/Users/s_kozake/dalvik-sdk/dalvik-sdk-8u40-ea3
./gradlew installDebug
タブレットで動かす事ができました!
ボタンを押すと、ラベルが変わります。
もし、ビルドでエラーが発生した場合は、stacktraceオプションをつけてエラー内容を
参照して対処してください。
./gradlew installDebug --stacktrace
ビルドは成功して、タブレットにアプリケーションはインストールされたけど動作しない場合は、logcatでログを表示してエラー内容を確認できます。
{sdk.dir}/platform-tools/adb logcat
もちろん、ボタンを押せただけだと何も面白くありません!
JavaFXの色々な機能を簡単に試してみました!!
・WebView
WebView browser = (WebView) root.lookup("#browser");
WebEngine engine = browser.getEngine();
engine.load("http://google.com");
・Chart
ObservableList<PieChart.Data> pieChartData =
FXCollections.observableArrayList(
new PieChart.Data("No Money..(; ;)", 0.7110),
new PieChart.Data("I have a lot of Money!!(((o(^ ^)o)))", 0.2790),
new PieChart.Data("Etc", 0.01)
);PieChart chart = (PieChart) root.lookup("#PieChart");
chart.setData(pieChartData);
chart.setTitle("No Money or a lot of Money");
PieChartも表示できました!
・Binding
TextArea shipping = (TextArea) root.lookup("#shipping");
TextArea billing = (TextArea) root.lookup("#billing");
billing.textProperty().bindBidirectional(shipping.textProperty());
上と下のテキストエリアの入力がバインディングで機能することも確認できました!
無事、動きました!!!(((o(*゚▽゚*)o)))
まだまだ日本語入力まわりが弱かったり、動作ももっさりしています。
グラフで日本語を表示しようとしたらダメでした。Fontのロードに失敗しているみたい。
また、どうやって内部DB(SQLite)にアクセスするのかなども分かっていません。
ただ、現状でそこそこ動くみたいですし、将来的にどうなるかが楽しみですね。
検証に使ったソースはGithubに上げていますので、参考にしてください。
https://github.com/kozake/androidFX
明日は orekyuu さんの「JavaFXで夢のCanvasライフ」です!