JavaFXはWPFと比較してどうですか?[閉まっている]


93

私はほとんど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に変更して、比較が(うまくいけば)更新され続けるようにします。


7
83票の質問は建設的ではないと考えることができるのはおかしい。
kristianp

回答:


120

私はここ数週間、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も確認してください。


9
これを本当にありがとう、これは非常に教育的です。JavaFXの知識をさらに進歩させて、この答えをさらに強化できるとしたら、それはすばらしいことです。
Aviad P.

5
私もあなたの答えを読んで楽しんだし、JavaFXを使用した作業でさらに洞察が明らかになれば、もっと聞いてみたいと思います。
Paul-Sebastian Manole

21

JavaFXの感触を得るには、実際に試してみるのが一番だと思います。JavaFX Webサイトには、優れたチュートリアルがいくつかあります。ここにいくつかあります:

彼らはかなり速く、あなたにその言語の良い感じを与えます。その他のチュートリアルや記事に興味がある場合は、JavaFXサイトに他にもたくさんあります。

質問に対する具体的な回答については、次のとおりです。

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

関連する別の質問を次に示します。


15
JavaFXはJava 7で大幅な更新を行っているため、この回答は古くなっています。こちらをご覧ください
ゾルタン・

7
JavaFXがswingとAWTを使用していることを確信していますか?プリズムと呼ばれる独自のレンダリングエンジンがあると思います。JavaFXアプリの実行時にイベントディスパッチスレッドは作成されません。
までのアンディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.