web-dev-qa-db-ja.com

JavaFXはWPFと比較してどうですか?

私はほとんどC#プログラマーです。10年ほど前にJavaを書くのを止めましたが、記事を読んでJava友達と話すなど.

JavaFXと呼ばれる新しいリッチGUIフレームワークについて聞いたことがありますが、それをJava以外のパラレルと比較するリソースが見つかりませんでした。

私はC#とWPFに非常に精通しているので、2つのテクノロジーの類似点または相違点について感じたいと思います。

編集:答えが来ていないので、私はより具体的にしようとします:

  1. WPFはXAMLを使用してビジュアルツリーを作成しますが、JavaFXには同様のものがありますか?
  2. WPFはMVVMパターンのビューモデルへのバインドで最もよく使用されますが、JavaFXもバインドを広範囲に使用しますか?
  3. WPFはレンダリングにGPUを使用しますが、JavaFXも同じことを行いますか?
  4. ネットPCのブラウザーで実行した場合、SilverlightはJavaFXと比較してどうですか?

...さらに来て...

これをコミュニティWikiに変更して、比較が更新され続けるようにします(うまくいけば)。

86
Aviad P.

私はこの数週間JavaFXを学んでいます。私の目では、WPFと比較する方法の概要を以下に示します。

私のコメントはすべてJavaFX 2.0に関連しています。プラットフォームはまだかなり未熟であり、積極的に開発されているため、この情報はおそらく変更される可能性があります。

グラフィックス

WPFと同様に、JavaFXは保持されたグラフィックスレンダリングシステムを使用します。ユーザーインターフェイスは、WPFのUIElementに概念的に似ていると考えることができる「ノード」で構成されるシーングラフで構成されます。

JavaFXは、利用可能な場合、グラフィックレンダリングをGPUにオフロードします。グラフィックシステムは、WindowsではDirectXを使用し、他のプラットフォームではOpenGLを使用します。

マークアップ

JavaFXユーザーインターフェイスは、コードとFXMLマークアップの両方で作成できます。これは、要素グラフをネストすることでオブジェクトグラフを作成できるという点で、XAMLに似ています。

FXMLには、プロパティバインド(単純式のみ)やイベントハンドラーへのバインド(anyonEventメソッド)など、XAMLと同様の機能がいくつかあります。イベントハンドラーはインラインで宣言できますが、通常は関連するコントローラーのイベントにバインドします。

FXMLファイルには、複雑なイベントハンドラーを宣言し、プロパティ間のバインドを設定できるコントローラーを関連付けることができます。これはMVCの意味でのコントローラーであり、WPFワールドのviewModelとは異なります(通常、コントローラーはノードとコントロールへの参照を持ちます)。

WPFとの違いの1つは、FXMLがnotBAMLのような中間バイナリ表現にコンパイルされているように見えることです。私はまだパフォーマンスの問題に気づいていませんが、システムを広範囲に使用していません。ただし、プラットフォームがコードの記述を推奨しており、スタイルが個別に宣言されているため、FXMLは通常XAMLよりも短い傾向があることに気付きました。

FXMLの概要は こちら にあります。

シーンビルダーは(ビールのように)無料で提供されるため、UIを手動でコーディングしたくない場合は、要素をドラッグアンドドロップし、プロパティを設定し、コントローラーのコードにバインドすると、FXMLが自動的に生成されます。明らかに、シーンビルダーはExpression Blendほど強力ではありませんが、Visual Studioが提供する「デザイナー」よりも優れています。

バインディング

JavaFXには非常に強力なプロパティとバインディングシステムがあります。 Java Beanパターンは、プロパティをカプセル化するクラスを含むように拡張されました(WPF依存プロパティがプロパティを表す方法と同様)。これらのクラスは、無効化と変更通知を提供するインターフェイスを実装します。

無効化通知と変更通知には区別があります。無効化は、バインディング式が現在無効であり、再計算する必要があることを示しています。 get()またはgetValue()メソッドを介してプロパティ値を要求するまで、実際には再計算は行われません。ただし、変更リスナーを登録している場合、式はすぐに再評価され、そのプロパティにバインドされているものはすべて変更を反映します。

JavaFXは、getおよびsetプロパティとプロパティラッパーのインスタンスを返すメソッド(WPFプロパティのように静的ではない)を使用して、WPFと同様の方法でこれらのプロパティを公開します。

multipleプロパティ間に複雑なバインディングを作成できます。整数プロパティを他の2つの合計(a = b + c)にしたいですか?問題ありません。JavaFXは、このような種類の関係を表現するFluent APIを提供します。

A.Add(B、C);

BまたはCのいずれかの値が変更された場合、適切な通知が発生し、Aの再評価が必要であることをシステムが認識します。この場合、他のプロパティにバインドされているAの値を設定しようとすると、このコンテキストでは意味をなさないため、例外がスローされることに注意してください。

これらの式は、かなり複雑なE.G. a = (b + c) * (d - e)および任意の数のプロパティを含めることができます。流れるようなAPIはかなり読みやすく、使いやすいですが、Microsoftライブラリのいくつかが提供するFluent APIほど素敵ではありませんが、これはJavaFXではなくJava言語の制限によります自体。

同じタイプのプロパティ間で単純な双方向バインディングを作成できるため、一方が更新された場合、他方が自動的に変更を反映します。

JavaFXは、APIによって提供されないカスタムバインディング式を作成する場合、またはパフォーマンスが懸念される場合に、バインディングを自分でカスタマイズするための低レベルAPIも提供します。

JavaFXとWPFの最大の違いの1つは、バインディングが主にJavaFXのコードで実行されることと、マークアップでバインディングを確立するWPFの方法です。

プロパティとバインディングの概要は here にあります。

スタイル

JavaFXはCSSを使用して、シーングラフに含まれるノードの外観を変更します。各ノードタイプに設定できるタイプとプロパティを説明する完全な仕様が用意されています。

JavaFXは、他の場所で定義および使用できる変数など、CSSの改善に役立ついくつかの追加機能も提供します。

.button {
    my-custom-color: RGB(234, 44, 78);
}

.my-control {
    -fx-background-color: my-custom-color
}

また、グラデーションのようなものを作成するのに役立つ、以前に定義された他の色から色を引き出すことができるいくつかの関数も提供します。これは、色の基本パレットを定義し、残りをこれらの値から生成できることを意味します(これがデフォルトのJavaFX CSSファイルの機能です)。

JavaFX CSSでは、ノードが使用するレイアウトのtypeを定義できません(これを書いている時点では、すべてのレイアウトはコードで実行する必要があります)。これはCSSの1つの側面であり、HTMLで使用するときに本当に苦痛をもたらしたので、私にとっては非常にうまく機能します。

個人的には、私の好みには冗長すぎる傾向があるXAMLスタイルよりもCSSを好みます。

JavaFX CSSのガイドは here にあります。

レイアウト

JavaFXは、WPFが提供するものと同様の多くのレイアウトペインを提供します。私が気づいた違いの1つは、メジャーとレイアウトコントラクトがRegionクラスの継承チェーンの上位で定義されていることです。

前述のように、CSSを使用してレイアウトを実行することはできませんが、コード、FXMLを使用して表現するか、シーンビルダー(最終的にFXMLに変換されます)を使用して作成できます。

コントロール

JavaFXは、成長を続けるコントロールのライブラリを提供します。 JavaFXとWPFの大きな違いの1つは、コントロールが本質的にブラックボックスであり、WPFコントロールのように再テンプレート化できないことです。また、WPFコントロールよりも公開されるプロパティがはるかに少ないようです。

コントロールは、実装固有の領域の一部をCSSに公開し、コントロールの特定の領域をスタイルのターゲットにすることができます。これは、コントロールのsubstructureとして知られています。例えば。 CheckBoxは2つの下位構造を公開します。ボックスとチェックマークにより、コントロールの各部分を個別にスタイル設定できます。前述のように、CSSを使用して変更できるのはコントロールのlookのみですが、feelは変更できないことに注意してください。例えば。 WPF TabPaneでできるように内部レイアウトパネルを変更することで、TabControlがコンテンツをレイアウトする方法を劇的に変更することはできません。

これはかなり制限的に聞こえますが、JavaFXでカスタムコントロールを作成する好ましい方法は、レイアウトパネルから派生したラインに沿ってコンポジションを使用して標準コントロールを配置し、CSSを使用してスタイルを変更することです。

結論

全体として、現時点でJavaFXが提供するものに非常に感銘を受けました。 WPFほど成熟しているわけではありませんが、積極的に開発されており、Oracleは確かにこれを支持しているようです。成功したかどうかは時間が経てばわかります。

JavaFXを試してみることをお勧めします。 documentation を読み、小さなアプリケーションをまとめてみて、あなたの考えを見てください。

また、 FXExperience.com も確認してください。これは、開発チームからの情報で定期的に更新されます。

115
Benjamin Gale

JavaFXの感触をつかむ最良の方法は、試してみることです。 JavaFX Webサイトにはいくつかの優れたチュートリアルがあります。ここにカップルがあります:

彼らは非常に迅速であり、言語に良い感じを与えます。他のチュートリアルや記事に興味がある場合は、 JavaFX サイトに他の多くのサイトがあります。

質問への具体的な回答:

  1. JavaFXには、XML派生物ではない「ビジュアルツリー」を作成するための独自の宣言型言語があります。 UIはシーングラフに基づいているため、さまざまな効果やアニメーションをグラフ内の任意のノードに適用できます。詳細については、チュートリアルを参照してください。 JavaFX用のデザイナーツールもあります(まだ試していません)。
  2. JavaFXには言語に組み込まれたバインディングがあります
  3. デスクトップのJavaFXは、Java GPUレンダリングを使用するAWT/Swingを使用します。Javaのすべてのバージョンは、グラフィックの多くをGPUにオフロードするようです。ChrisCampbell Sunから GPUアクセラレーション についてのブログがいくつかあります。JavaFXのモバイルバージョンにGPUアクセラレーションがあるかどうかはわかりません。JavaFXの以前のバージョンは必要なパフォーマンスを十分に発揮できないことがわかりましたが、最新バージョンのパフォーマンスが以前のバージョンよりも大幅に改善されており、さらに高速化に取り組んでいることをご理解ください。
  4. JavaFxはJavaアプレットを使用してブラウザで実行します。Java 6 update 10の時点で、JavaアプレットフレームワークはAdobe Flashほどシームレスではありませんが、大幅に改善されています。SilverlightをLinuxで動作させるのに苦労したが、LinuxでJavaFXを動作させる以外は、Silverlightと比較してどうなるかわかりません。

関連する別の質問

20
Jay Askren