ここ数週間、JavaFX を学んでいます。これは、私の目に WPF と比較した場合の概要です。
私のコメントはすべて JavaFX 2.0 に関するものです。プラットフォームはまだかなり未熟で、活発に開発されているため、この情報はおそらく変更される可能性があります。
グラフィック
WPF と同様に、JavaFX は保持されたグラフィック レンダリング システムを使用します。ユーザー インターフェイスは、概念的には WPF のUIElement
.
JavaFX は、利用可能な場合、グラフィック レンダリングを GPU にオフロードします。グラフィック システムは、Windows では DirectX を使用し、他のプラットフォームでは OpenGL を使用します。
マークアップ
JavaFX ユーザー インターフェイスは、コードと FXML マークアップの両方で作成できます。FXML マークアップは、要素をネストしてオブジェクト グラフを作成できるという点で XAML に似ています。
FXML には、プロパティ バインディング (単純な式のみ) やイベント ハンドラー (任意のonEventメソッド) へのバインディングなど、XAML と同様の機能がいくつかあります。イベント ハンドラはインラインで宣言できますが、通常は関連付けられたコントローラのイベントにバインドします。
FXML ファイルには、複雑なイベント ハンドラーを宣言し、プロパティ間のバインディングを設定できるコントローラーを関連付けることができます。これは MVC の意味でのコントローラーであり、WPF の世界の viewModel と同じではありません (通常、コントローラーにはノードとコントロールへの参照があります)。
WPF との違いの 1 つは、FXML が BAMLのような中間バイナリ表現にコンパイルされていないように見えることです。まだパフォーマンスの問題に気付いていませんが、システムを広範囲に使用していません。ただし、FXML は通常、XAML よりも短くなる傾向があることに気付きました。これは、プラットフォームが依然としてコードの記述を奨励し、スタイルが個別に宣言されているためです。
FXML の概要については、こちらを参照してください。
シーン ビルダーは (ビールのように) 無料で提供されているため、UI のハンド コーディングが気に入らない場合は、要素をドラッグ アンド ドロップし、プロパティを設定して、コントローラーでコードにバインドすると、FXML が自動的に生成されます。明らかに、シーン ビルダーは Expression Blend ほど強力ではありませんが、Visual Studio が提供する「デザイナー」よりは優れています。
バインディング
JavaFX には、非常に強力なプロパティとバインディング システムがあります。Java Bean パターンが拡張され、プロパティをカプセル化するクラスが含まれるようになりました (WPF の依存関係プロパティがプロパティを表す方法と同様)。これらのクラスは、無効化と変更通知を提供するインターフェースを実装します。
無効化通知と変更通知には違いがあります。無効化は、バインディング式が無効になり、再計算する必要があることを示しているだけです。get()
またはgetValue()
メソッドを介してプロパティ値を要求するまで、再計算は実際には行われません。ただし、変更リスナーを登録している場合は、式がすぐに再評価され、そのプロパティにバインドされているすべてのものに変更が反映されます。
JavaFX は、get プロパティと set プロパティ、およびプロパティ ラッパーのインスタンスを返すメソッド (WPF プロパティのように静的ではありません) を使用して、同様の方法でこれらのプロパティを WPF に公開します。
複数のプロパティ間で複雑なバインディングを作成できます。整数プロパティを他の 2 つの合計 (a = b + c) にしたいですか? 問題ありません。JavaFX は Fluent API を提供して、これらの種類の関係を表現します EG
A.Add(B, C);
B または C のいずれかの値が変更された場合、適切な通知が発生するため、システムは A を再評価する必要があることを認識します。この場合、他のプロパティにバインドされている A の値を設定しようとすると例外がスローされるため、このコンテキストでは意味がないことに注意してください。
これらの式はかなり複雑な EGa = (b + c) * (d - e)
であり、任意の数のプロパティを含めることができます。Fluent API はかなり読みやすく使いやすいですが、一部の Microsoft ライブラリで提供されている Fluent API ほど優れたものではありませんが、これは JavaFX 自体よりも Java 言語の制限によるものです。
同じタイプのプロパティ間に単純な双方向バインディングを作成して、一方が更新された場合にもう一方が自動的に変更を反映するようにすることができます。
JavaFX は、API によって提供されないカスタム バインディング式を作成する場合、またはパフォーマンスが懸念される場合に、バインディングを自分でカスタマイズするための低レベル API も提供します。
JavaFX と WPF の最大の違いの 1 つは、バインディングが主に JavaFX のコードで実行されるのに対し、マークアップでバインディングを確立する WPF の方法です。
プロパティとバインディングの概要については、こちらを参照してください。
スタイル
JavaFX は CSS を使用して、シーン グラフに含まれるノードの外観を変更します。各ノード タイプで設定できるタイプとプロパティを説明する完全な仕様が利用可能です。
JavaFX は、他の場所で定義して使用できる変数など、CSS の改善に役立ついくつかの追加機能も提供します EG
.button {
my-custom-color: RGB(234, 44, 78);
}
.my-control {
-fx-background-color: my-custom-color
}
また、グラデーションなどの作成に役立つ、以前に定義された他の色から色を派生させることができるいくつかの関数も提供します。これは、色の基本パレットを定義でき、残りはこれらの値から生成できることを意味します (これは、デフォルトの JavaFX CSS ファイルが行うことです)。
JavaFX CSS では、ノードで使用されるレイアウトのタイプを定義できません(これを書いている時点では、すべてのレイアウトをコードで実行する必要があります)。これは、CSS の 1 つの側面であり、HTML で使用するときに本当に苦労したため、私にとっては非常にうまく機能します。
個人的には、自分の好みには冗長すぎる傾向がある XAML スタイルよりも CSS を好みます。
JavaFX CSS のガイドは、ここにあります。
レイアウト
JavaFX は、WPF によって提供されるものと同様の多数のレイアウト ペインを提供します。私が気づいた違いの 1 つは、メジャーとレイアウトのコントラクトが、Region
クラスの継承チェーンのさらに上に定義されていることです。
前述のように、CSS を使用してレイアウトを実行することはできませんが、コード、FXML を使用して表現するか、シーン ビルダー (最終的に FXML に変換されます) を使用して作成することができます。
コントロール
JavaFX は、私たちが期待するようになった、増え続けるコントロールのライブラリを提供します。JavaFX と WPF の主な違いの 1 つは、コントロールが本質的にブラック ボックスであり、WPF コントロールのように再テンプレート化できないことです。また、WPF コントロールよりもはるかに少ないプロパティを公開しているようです。
コントロールは実装固有の領域の一部を CSS に公開し、コントロールの特定の領域をスタイルの対象にすることができます。これは、コントロールのサブ構造として知られています。EG aCheckBox
は 2 つの部分構造を公開します。ボックスとチェック マークにより、コントロールの各部分を個別にスタイルできます。前述のように、CSS を使用して変更できるのはコントロールの外観のみですが、フィールは変更できないことに注意してください。TabPane
EG のように内部レイアウト パネルを変更してコンテンツをレイアウトする方法を大幅に変更することはできませんTabControl
。
これはかなり限定的に聞こえるかもしれませんが、JavaFX でカスタム コントロールを作成する好ましい方法は、レイアウト パネルから派生した線に沿ってコンポジションを使用して標準コントロールを配置し、CSS を使用してそれらのスタイルを変更することです。
結論
全体として、現時点で JavaFX が提供するものに非常に感銘を受けています。WPFほど成熟しているとは言えませんが、積極的に開発されており、オラクルは確かにこれを支持しているようです。それが成功するかどうかは時が経てばわかります。
JavaFX を試してみることをお勧めします。ドキュメントを読み、小さなアプリケーションをまとめてみて、どう思うか見てみましょう。
また、開発チームからの情報で定期的に更新されるFXExperience.comもチェックしてください。