今月から、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は廃止されることになりました。

注1) JavaFX Scriptのコンパイラ部分はフォークされ、Project Visageという オープンソースのプロジェクトに引き継がれています

 もともと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プロジェクトで開発が進められています。