今月から、GUIライブラリのJavaFXについて紹介していきます。
JavaFXについては、本連載の2010年4月から12月にかけて紹介しました。この時のJavaFXはバージョンが1.xであり、JavaFX Scriptという独自スクリプト言語でUIを記述していました。
しかし、2010年10月に行われたJavaOneですべてが変わってしまいました。
JavaFX Scriptの廃止が決まり(注1)、JavaFXはJavaのGUIライブラリとして生まれ変わることになったのです。これに応じて、携帯電話向けのJavaFX Mobileや、セットトップボックスやスマート TV 向けの JavaFX TVは廃止されることになりました。
もともとJavaFXはRIAに対応したプラットフォームでしたが、この発表でJavaFXの方向が大きく変更しました。RIAから、Javaのデスクトップアプリケーション作成のためのライブラリになったわけです。いうなれば、Swingと同列のライブラリになったということを示しています。
しかし、JavaFX 1.xをすべて捨ててしまうわけではなく、APIはJavaFX 2にも引き継がれます。また、バインドなどJavaFX Scriptが言語でサポートしてた機能も、APIで対応されることになりました。
その後、2011年10月に開催されたJavaOneにあわせて、生まれ変わったJavaFX 2.0がリリースされました。また、この時のJavaOneで、JavaFX 3.0をJava SE 8に含めることが発表されています。
つまり、Java SE 8からはSwingに代わり、JavaFXがJavaの標準GUIライブラリになるわけです。
JavaFXとは
JavaFXは前述したように、JavaのGUIライブラリです。その主な特徴を以下に示します。
- ハードウエアアクセラレーションを多用した高速なグラフィックエンジン
- XMLによるGUI構成の記述
- グラフなどを含めた多彩なGUI部品
- ブラウザ
- ムービーなどのメディアAPI
- CSSのサポート
- アニメーション
- ドロップシャドウなどのエフェクト
- バインド
JavaFXが採用しているグラフィックエンジンはPrismと呼ばれます。Prismグラフィックエンジンは、GPUのハードウエアアクセラレーションを多用し、高速なレンダリングを行うことができます。
PrismグラフィックエンジンはNVIDIA、AMD、IntelのGPUに対応しています。サポートしている具体的なGPUの型番については、JavaFX System RequirementsのGraphics Supportをご覧ください。
なお、対応していないGPUの場合、Java 2Dを使用してレンダリングを行います。この場合、パフォーマンスは低下しますが、Java SEが動作する環境であれば、JavaFXが動作することを保証しています。
XMLでGUIの構成を記述するのは、AdobeのMXMLやMicrosoftのXAML、Androidなど、多くのGUIフレームワークで使用されています。詳しくは次回説明しますが、手続き型言語のJavaでGUIを記述すると、GUIの構造が分かりにくくなってしまいます。
XMLで表すことで、GUIの構造を表しやすくなります。さらに、XMLはツールとの相性もいいという特徴があります。
そこで、JavaFXではFXMLというXMLでGUIを表します。また、FXMLをグラフィカルに編集するためのツールとしてScene Builderが提供されています。
JavaFXではGUI部品も充実しています。
ボタンやテキストフィールドなどSwingと同様のGUI部品に加え、グラフやブラウザなども使用することができます。特にブラウザは、ChromeやSafariなどで使用されているWebKitをベースにしています。このため、CanvasなどHTML 5の機能もサポートしています。
もちろん、ムービーやサウンドなども扱うことができます。
また、これらのGUI部品はCSSによって見た目を変化させることができます。
アニメーションとエフェクトは最近のGUIには欠かせない要素です。JavaFXでは、簡単にアニメーションやエフェクトを使用することができます。
最後のバインドというのは、変数同士を自動的に同期させる技術です。モデルとビューの同期など、様々な場面に使用することができます。
このような特徴を持つJavaFXですが、まだ登場してから日が浅いこともあり、欠けている機能も多々あります。たとえば、JavaFX 2.1.1では、印刷がサポートされていません。しかし、Java SE 8に向けて、急ピッチで開発が進んでいます。
現在、JavaFXはOpenJDKのサブプロジェクトであるOpenJFXプロジェクトで開発が進められています。