2 JavaFXアーキテクチャの理解
この章では、JavaFXアーキテクチャおよびエコシステムについて詳細に説明します。
図2-1に、JavaFXプラットフォームのアーキテクチャ・コンポーネントを示します。図の後に続く項では、各コンポーネントについて、および構成要素がどのように相互接続するかについて説明します。JavaFXパブリックAPIの下に、JavaFXコードを実行するエンジンがあります。これは、Prismと呼ばれるJavaFX高性能グラフィック・エンジン、Glassと呼ばれる小規模で効率的なウィンドウ・システム、メディア・エンジンおよびWebエンジンを含む、サブコンポーネントで構成されています。これらのコンポーネントは公開されているものではありませんが、JavaFXアプリケーションが何によって実行されているかをより深く理解できるように説明しています。
シーン・グラフ
図2-1で最上位レイヤーの一部として示されているJavaFX Sceneグラフは、JavaFXアプリケーションの作成の開始点となるものです。これは、アプリケーションのユーザー・インタフェースのすべてのビジュアル要素を表す、ノードの階層ツリーです。これによって入力を処理でき、これをレンダリングできます。
シーン・グラフ内の単一の要素は、ノードと呼ばれます。各ノードには、ID、スタイル・クラスおよびバウンディング・ボリュームがあります。シーン・グラフのルート・ノードを除き、シーン・グラフ内の各ノードには1つの親と0個以上の子があります。次のものがある場合もあります。
-
効果(ぼかしやシャドウなど)
-
不透明度
-
変換
-
イベント・ハンドラ(マウス、キー、インプット・メソッドなど)
-
アプリケーション固有の状態
SwingやAbstract Window Toolkit (AWT)と異なり、JavaFX Sceneグラフには、コントロール、レイアウト・コンテナ、イメージおよびメディアに加えて、四角形やテキストなどのグラフィックス・プリミティブも含めることができます。
ほとんどの使用において、特にリッチUIが使用される場合に、シーン・グラフによってUIの操作が簡略化されます。シーン・グラフ内の様々なグラフィックスのアニメーション化は、javafx.animation APIを使用して迅速に実行でき、XML docなどの宣言メソッドも正常に機能します。
javafx.scene
APIでは、次のような複数のタイプのコンテンツを作成および指定できます。
-
ノード: 図形(2-Dおよび3-D)、イメージ、メディア、埋込みWebブラウザ、テキスト、UIコントロール、グラフ、グループおよびコンテナ
-
状態: 変換(ノードの位置指定および方向)、ビジュアル効果、コンテンツのその他のビジュアル状態
-
効果: シーン・グラフのノードの外観を変更する単純なオブジェクト(ぼかし、シャドウ、色調整など)
詳細は、JavaFXシーン・グラフの操作ドキュメントを参照してください。
JavaFX機能のJavaパブリックAPI
図2-1に示すJavaFXアーキテクチャの最上位レイヤーでは、リッチ・クライアント・アプリケーションの開発をサポートするJavaパブリックAPIの完全なセットが提供されます。これらのAPIによって、リッチ・クライアント・アプリケーションの作成に比類のない自由度と柔軟性が提供されます。JavaFXプラットフォームでは、Javaプラットフォームの非常に優れた機能が包括的で没入型のメディア機能と組み合せられ、直観的で包括的なワンストップ開発環境となります。JavaFX機能のこれらのJava APIには、次のような特徴があります。
-
汎用、注釈、マルチスレッド、ラムダ式(Java SE 8で導入)などの強力なJava機能を使用できます。
-
Web開発者がGroovyやJavaScriptなどの他のJVMベースの動的言語からJavaFXを使用することが簡単になります。
-
Java開発者は、大規模または複雑なJavaFXアプリケーションを記述するために、Groovyなどの他のシステム言語を使用できます。
-
高パフォーマンスの遅延バインディング、バインディング式、バインドされたシーケンス式および部分的なバインドの再評価のサポートを含む、バインディングを使用できます。代替言語(Groovyなど)でこのバインディング・ライブラリを使用して、JavaFX Scriptに似たバインディング構文を導入できます。
-
アプリケーションでデータ・モデルに対するユーザー・インタフェースを記述し、それらのデータ・モデルにおける変更を監視し、それに応じて対応するUIコントロールを更新できるようにする、監視可能なリストおよびマップが含まれるようにJavaコレクション・ライブラリを拡張します。
JavaFX APIおよびプログラミング・モデルは、JavaFX 1.x製品ラインの継続です。JavaFX APIのほとんどは、直接、Javaに移植されています。レイアウトやメディアなどの一部のAPIとその他の多くの詳細が、JavaFX 1.xリリースのユーザーからのフィードバックに基づいて、改善および簡略化されています。JavaFXでは、スタイル設定を制御するためのCSSやアクセシビリティ仕様のためのARIAなどのWeb規格への依存を高めています。その他のWeb規格の使用も検討されています。
グラフィックス・システム
図2-1に青で示すJavaFXグラフィックス・システムは、JavaFX Sceneグラフ・レイヤーの下にある実装の詳細です。2-Dと3-D両方のシーン・グラフがサポートされます。システムのグラフィックス・ハードウェアがハードウェア高速化レンダリングのサポートに十分ではない場合は、ソフトウェア・レンダリングが行われます。
JavaFXプラットフォームには、次の2つのグラフィックス高速化パイプラインが実装されています。
-
Prism: レンダー・ジョブが処理されます。これは、ハードウェア・レンダラとソフトウェア・レンダラの両方で稼働します(3-Dを含む)。JavaFXシーンのラスタライズとレンダリングが行われます。使用されるデバイスに基づいて、次の複数のレンダー・パスがあります。
-
Windows XPおよびWindows VistaでのDirectX 9
-
Windows 7でのDirectX 11
-
Mac、Linux、組込みでのOpenGL
-
ハードウェア高速化が不可能な場合のソフトウェア・レンダリング
可能な場合は完全にハードウェア高速化されたパスが使用されますが、使用できない場合は、ソフトウェア・レンダー・パスがすでにすべてのJava Runtime Environments (JRE)に配布されているため、ソフトウェア・レンダー・パスが使用されます。これは、3-Dシーンを処理する場合に特に重要です。ただし、ハードウェア・レンダー・パスを使用する方がパフォーマンスは向上します。
-
-
Quantum Toolkit: これにより、PrismとGlassウィンドウ・ツールキットが結合され、スタックの上位にあるJavaFXレイヤーで使用可能になります。レンダリングとイベント処理に関連するスレッド・ルールも管理されます。
Glassウィンドウ・ツールキット
図2-1の中間部分にベージュで示すGlassウィンドウ・ツールキットは、JavaFXグラフィックス・スタック内の最下位レベルです。その主な役割は、ウィンドウ、タイマー、面の管理など、ネイティブのオペレーティング・サービスを提供することです。JavaFXプラットフォームをネイティブ・オペレーティング・システムに接続するプラットフォーム依存レイヤーとして機能します。
Glassツールキットによってイベント・キューも管理されます。固有のイベント・キューを管理するAbstract Window Toolkit (AWT)と異なり、Glassツールキットでは、スレッドの使用を管理するためにネイティブ・オペレーティング・システムのイベント・キュー機能が使用されます。また、AWTと異なり、GlassツールキットはJavaFXアプリケーションと同じスレッドで実行されます。AWTでは、AWTのネイティブ部分が1つのスレッドで実行され、Javaレベルが別のスレッドで実行されます。これにより多くの問題が発生しますが、その多くはJavaFXで単一のJavaFXアプリケーション・スレッド・アプローチを使用することによって解決されます。
スレッド
特定の時点で、次のスレッドのうちの2つ以上が実行されます。
-
JavaFXアプリケーション・スレッド: これは、JavaFXアプリケーション開発者が使用するプライマリ・スレッドです。ウィンドウの一部であるシーンであるライブ・シーンには、このスレッドからアクセスする必要があります。シーン・グラフはバックグラウンド・スレッドで作成および操作できますが、そのルート・ノードがシーン内のライブ・オブジェクトに接続されている場合、そのシーン・グラフにはJavaFXアプリケーション・スレッドからアクセスする必要があります。これにより、開発者は、ライブ・シーンのアニメーションをなめらかで高速に保ちながら、バックグラウンド・スレッドで複雑なシーン・グラフを作成できます。JavaFXアプリケーション・スレッドはSwingおよびAWTのイベント・ディスパッチ・スレッド(EDT)とは異なるスレッドであるため、JavaFXコードをSwingアプリケーションに埋め込むときは注意する必要があります。
-
Prismレンダー・スレッド: このスレッドでは、イベント・ディスパッチャとは別にレンダリングが処理されます。フレームNをレンダリングすると同時に、フレームN +1を処理できます。同時処理を実行するこの機能は、特に複数のプロセッサがある最近のシステムでは、大きな利点です。Prismレンダー・スレッドには、レンダリングで実行する必要がある作業をオフロードするために役立つ複数のラスタライズ・スレッドがある場合もあります。
-
メディア・スレッド: このスレッドはバックグラウンドで実行され、JavaFXアプリケーション・スレッドを使用することにより、シーン・グラフを介して最新のフレームを同期します。
パルス
パルスは、シーン・グラフ上の要素の状態をPrismと同期するタイミングであることをJavaFX Sceneグラフに示すイベントです。パルスは、最大で1秒当たり60フレーム(fps)に制限され、アニメーションがシーン・グラフで実行されているときは常に発生します。アニメーションが実行されていない場合でも、シーン・グラフ内で変更があるとパルスがスケジュールされます。たとえば、ボタンの位置が変更されると、パルスがスケジュールされます。
パルスが発生すると、シーン・グラフ上の要素の状態はレンダリング・レイヤーと同期されます。パルスによって、アプリケーション開発者はイベントを非同期で処理できます。この重要な機能によって、システムでパルスのイベントをまとめて処理できます。
レイアウトおよびCSSもパルス・イベントに関連付けられます。シーン・グラフでの多数の変更によって複数のレイアウトまたはCSSが更新される場合があり、それによってパフォーマンスが大幅に低下する可能性があります。システムでは、パフォーマンスの低下を避けるために、CSSおよびレイアウト・パスがパルスごとに1回自動的に実行されます。アプリケーション開発者は、パルスの前に測定するために、必要に応じてレイアウト・パスを手動でトリガーすることもできます。
Glassウィンドウ・ツールキットによって、パルス・イベントが実行されます。実行のために高分解能ネイティブ・タイマーが使用されます。
メディアおよびイメージ
JavaFXメディア機能は、javafx.scene.media
APIを介して使用できます。JavaFXでは、ビジュアル・メディアとオーディオ・メディアの両方がサポートされます。MP3、AIFFおよびWAVオーディオ・ファイルとFLVビデオ・ファイルがサポートされます。JavaFXメディア機能は3つの別々のコンポーネントとして提供され、Mediaオブジェクトはメディア・ファイルを表し、MediaPlayerはメディア・ファイルを再生し、MediaViewはメディアを表示するノードです。
図2-1に緑で示すメディア・エンジン・コンポーネントは、パフォーマンスと安定性を考慮して設計されており、プラットフォーム全体で一貫性のある動作が提供されます。詳細は、JavaFXアプリケーションへのメディア・アセットの組込みドキュメントを参照してください。
Webコンポーネント
Webコンポーネントは、そのAPIを介してWebビューアおよびフル・ブラウズ機能を提供する、Webkitに基づくJavaFX UIコントロールです。図2-1にオレンジで示すこのWebエンジン・コンポーネントは、HTML5、CSS、JavaScript、DOMおよびSVGをサポートするオープン・ソースのWebブラウザ・エンジンであるWebKitに基づいています。開発者は、次の機能をJavaアプリケーションに実装できます。
-
ローカルまたはリモートURLからのHTMLコンテンツのレンダリング
-
履歴のサポートと「戻る」および「進む」ナビゲーションの提供
-
コンテンツの再ロード
-
Webコンポーネントへの効果の適用
-
HTMLコンテンツの編集
-
JavaScriptコマンドの実行
-
イベントの処理
この埋込みブラウザ・コンポーネントは、次のクラスで構成されています。
-
WebEngine
: 基本的なWebページ・ブラウズ機能が提供されます。 -
WebView
: WebEngineオブジェクトがカプセル化され、HTMLコンテンツがアプリケーションのシーンに組み込まれ、効果および変換を適用するフィールドおよびメソッドが提供されます。これは、Node
クラスの拡張機能です。
また、開発者が両方の環境を最大限に利用できるようにするために、JavaコールをJavaScriptで制御できます(またはその逆)。JavaFX埋込みブラウザの詳細な概要は、JavaFXアプリケーションへのHTMLコンテンツの追加ドキュメントを参照してください。
CSS
JavaFXカスケード・スタイルシート(CSS)には、アプリケーションのソース・コードを変更せずに、カスタマイズしたスタイルをJavaFXアプリケーションのユーザー・インタフェースに適用する機能があります。CSSは、JavaFX Sceneグラフ内の任意のノードに適用でき、ノードに非同期で適用されます。JavaFX CSSスタイルは実行時に簡単にシーンに割り当てることもでき、アプリケーションの外観を動的に変更できます。
図2-2に、同じUIコントロールのセットへの2つの異なるCSSスタイルの適用を示します。
JavaFX CSSはW3C CSSバージョン2.1仕様に基づいており、バージョン3に対する現在の作業の一部が追加されています。JavaFX CSSのサポートおよび拡張機能は、準拠する任意のCSSパーサー(JavaFX拡張機能をサポートしないものも含む)によってJavaFX CSSスタイルシートがクリーンに解析されるように設計されています。これにより、JavaFXのCSSスタイルとその他の目的(HTMLページなど)のCSSスタイルを1つのスタイルシートに混在させることができます。JavaFXの値には少し異なるセマンティクスを持つものもあるため、標準のHTML CSSと互換性があるように見えるものも含め、すべてのJavaFXプロパティ名に-fx-
というベンダー拡張の接頭辞が付けられます。
JavaFX CSSの詳細は、「CSSによるJavaFXアプリケーションのスキニング」のドキュメントを参照してください。
UIコントロール
JavaFX APIを介して使用できるJavaFX UIコントロールは、シーン・グラフ内のノードを使用してビルドされます。これらは、JavaFXプラットフォームのビジュアル的に優れた機能を完全に使用でき、異なるプラットフォーム間で移植可能です。JavaFX CSSでは、UIコントロールのテーマ設定およびスキニングが可能です。
図2-3に、現在サポートされているUIコントロールの一部を示します。これらのコントロールは、javafx.scene.control
パッケージにあります。
使用できるすべてのJavaFX UIコントロールの詳細は、「JavaFX UIコントロールの使用」およびAPIドキュメントのjavafx.scene.control
パッケージを参照してください。
レイアウト
JavaFXアプリケーションのシーン・グラフ内のUIコントロールを柔軟で動的に配置できるように、レイアウト・コンテナまたはペインを使用できます。JavaFXのレイアウトAPIには、一般的なレイアウト・モデルを自動化する次のコンテナ・クラスが含まれています。
-
BorderPane
クラスでは、そのコンテンツ・ノードは上、下、右、左または中央のリージョンにレイアウトされます。 -
HBox
クラスでは、そのコンテンツ・ノードは1行に水平に配置されます。 -
VBox
クラスでは、そのコンテンツ・ノードは1列に垂直に配置されます。 -
StackPane
クラスでは、そのコンテンツ・ノードは背面と前面のある単一のスタックに配置されます。 -
GridPane
クラスでは、開発者はコンテンツ・ノードをレイアウトするための行と列の柔軟なグリッドを作成できます。 -
FlowPane
クラスでは、そのコンテンツ・ノードは水平または垂直のフロー内に配置され、指定した幅(水平の場合)または高さ(垂直の場合)の境界で折り返されます。 -
TilePane
クラスでは、そのコンテンツ・ノードは均一のサイズのレイアウト・セルまたはタイル内に配置されます。 -
AnchorPane
クラスでは、開発者はレイアウトの上、下、左側または中央にアンカー・ノードを作成できます。
必要なレイアウト構造を実現するために、異なるコンテナをJavaFXアプリケーション内にネストできます。
レイアウトの使用方法の詳細は、JavaFXでのレイアウトの操作の記事を参照してください。JavaFXのレイアウトAPIの詳細は、APIドキュメントのjavafx.scene.layout
パッケージを参照してください。
2-Dおよび3-D変換
次のjavafx.scene.tranform
クラスを使用して、JavaFX Sceneグラフ内の各ノードをx-y座標で変換できます。
-
translate
: 初期位置に対して相対的なx、y、z面に沿って、ノードを1つの場所から別の場所に移動します。 -
scale
: スケーリング係数に応じて、x、y、z面で大きく、または小さく表示されるようにノードをサイズ変更します。 -
shear
: x軸とy軸が直角に交わらなくなるように、1つの軸を回転します。ノードの座標は指定した乗数でシフトされます。 -
rotate
: シーンの指定したピボット・ポイントを中心にしてノードを回転します。 -
affine
: 線の直線および平行プロパティを保持しながら、2-D/3-D座標から他の2-D/3-D座標への線形マッピングを実行します。このクラスは、直接使用するのではなく、Translate
、Scale
、Rotate
またはShear
変換クラスとともに使用する必要があります。
変換の使用の詳細は、「JavaFXでの変換の適用」ドキュメントを参照してください。javafx.scene.transform
APIクラスの詳細は、APIドキュメントを参照してください。
ビジュアル効果
JavaFX Sceneグラフのリッチ・クライアント・インタフェースの開発には、ビジュアル効果つまりJavaFXアプリケーションの表示をリアルタイムで拡張するための効果の使用が含まれます。JavaFXの効果は主にイメージ・ピクセルベースであり、したがって、シーン・グラフ内のノードのセットを取得し、イメージとしてレンダリングし、指定された効果を適用します。
JavaFXで使用できるビジュアル効果には、次のクラスの使用が含まれるものがあります。
-
Drop Shadow
: 効果が適用されるコンテンツの後ろの特定のコンテンツにシャドウをレンダリングします。 -
Reflection
: 実際のコンテンツの下に、コンテンツの反射されたバージョンをレンダリングします。 -
Lighting
: 特定のコンテンツ上で輝く光源をシミュレートして、平らなオブジェクトに、より現実的な3次元の外観を加えることができます。
使用できるビジュアル効果のいくつかを使用する方法の例は、「ビジュアル効果の作成」ドキュメントを参照してください。使用できるすべてのビジュアル効果クラスの詳細は、APIドキュメントのjavafx.scene.effect
パッケージを参照してください。