私はここ数週間、JavaFXを学んでいます。これは、私の目にはWPFと比較した高レベルの概要です。
私のコメントはすべてJavaFX 2.0に関連しています。プラットフォームはまだ未熟であり、積極的に開発されているため、この情報はおそらく変更される可能性があります。
グラフィックス
WPFと同様に、JavaFXは保持されたグラフィックレンダリングシステムを使用します。ユーザーインターフェイスは、概念的にはWPFと同様に考えることができる「ノード」で構成されるシーングラフで構成されUIElement
ます。
JavaFXは、可能な場合、グラフィックレンダリングをGPUにオフロードします。グラフィックスシステムは、WindowsではDirectX、他のプラットフォームではOpenGLを使用します。
マークアップ
JavaFXユーザーインターフェイスは、コードと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を提供しています。
A.Add(B、C);
BまたはCのいずれかの値が変更された場合、適切な通知が発生し、システムがAを再評価する必要があることを認識します。この場合、他のプロパティにバインドされているAの値を設定しようとすると例外がスローされるため、このコンテキストでは意味がありません。
これらの式はかなり複雑なEG a = (b + c) * (d - e)
にすることができ、任意の数のプロパティを含めることができます。Fluent APIはかなり読みやすく、使いやすいですが、一部のMicrosoftライブラリが提供するFluent APIほど優れていませんが、これは、JavaFX自体ではなく、Java言語の制限によるものです。
同じタイプのプロパティ間に単純な双方向バインディングを作成できるため、一方が更新された場合、もう一方は自動的に変更を反映します。
また、JavaFXは、APIによって提供されないカスタムバインディング式を作成する場合、またはパフォーマンスを懸念する場合に、バインディングを自分でカスタマイズするための低レベルAPIを提供します。
JavaFXとWPFの最大の違いの1つは、バインディングがマークアップでバインディングを確立するWPFの方法ではなく、主にJavaFXのコードで実行されることです。
プロパティとバインディングの概要はここにあります。
スタイル
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 a CheckBox
は2つのサブ構造を公開します。ボックスとチェックマークにより、コントロールの各部分を個別にスタイル設定できます。前述のように、CSSを使用して変更できるのはコントロールの外観のみですが、感触は変更できません。たとえばTabPane
、WPFでできるように内部レイアウトパネルを変更しても、コンテンツのレイアウト方法を劇的に変更することはできませんTabControl
。
これはかなり制限のように聞こえますが、JavaFXでカスタムコントロールを作成する好ましい方法は、レイアウトパネルから派生するラインに沿ってコンポジションを使用して標準コントロールを配置し、CSSを使用してスタイルを変更することです。
結論
全体として、現時点でJavaFXが提供する機能に非常に感心しています。WPFほど成熟しているわけではありませんが、積極的に開発されており、Oracleは確かにこれを支持しているようです。それが成功したかどうかは時間でわかります。
JavaFXを試してみることをお勧めします。ドキュメントを読み、小さなアプリケーションを組み立ててみて、あなたの考えを見てください。
また、開発チームからの情報で定期的に更新されるFXExperience.comも確認してください。