1. ホーム
  2. wpf

[解決済み] JavaFXはWPFと比較してどうですか?[クローズド]

2023-01-05 11:14:38

質問

私は主にC#プログラマで、Javaは10年ほど前に書かなくなりましたが、記事を読んだり、友人と話したりして、Javaの技術について行くようにしています。

JavaFXという新しいリッチGUIフレームワークについて聞いたことがありますが、非Javaのパラレルと比較した資料が見つかりませんでした。

私は C# と WPF に非常に精通しているので、この 2 つの技術がどの程度似ているか、または異なっているかについて感触を得たいと考えています。

EDIT: 回答が来ないので、もう少し具体的に書いてみます。

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

... もっと来る...

私はこれをコミュニティWikiに変更し、比較が常に更新されるようにします(希望的観測)。

どのように解決するのですか?

私はここ数週間、JavaFXを学んでいます。ここでは、私の目から見た WPF との比較について、ハイレベルな概要を説明します。

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

グラフィックス

WPFのように、JavaFXは保持されたグラフィックスレンダリングシステムを使用します。ユーザーインタフェースは、WPFの UIElement .

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

マークアップ

JavaFXのユーザーインターフェイスは、コードとFXMLマークアップの両方で作成することができます。

FXMLはプロパティバインディング(単純な式のみ)、イベントハンドラへのバインディング(任意の onEvent メソッド)。イベントハンドラはインラインで宣言することができますが、通常は関連するコントローラ内のイベントにバインドすることになります。

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

WPFとの違いの一つは、どうやらFXMLが ではない が BAML のような中間バイナリ表現にコンパイルされていないことです。私はまだパフォーマンスの問題を認識していませんが、このシステムを広範囲に使用しているわけではありません。しかし、プラットフォームがまだコードを書くことを奨励しており、スタイルが別々に宣言されているため、FXML は通常どの XAML よりも短くなる傾向があることに気づきました。

FXML の紹介は次のとおりです。 を参照してください。 .

シーンビルダーは無料で提供されているので、UIをハンドコーディングするのが嫌な場合は、要素をドラッグ&ドロップしてプロパティを設定し、コントローラ内のコードにバインドすれば、FXMLは自動的に生成されます。もちろん、シーンビルダーはExpression Blendほど強力ではありませんが、Visual Studioが提供する「デザイナー」よりはまだましです。

バインディング

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

無効通知と変更通知には区別があります。無効通知は、バインディング式が無効になり、再計算が必要であることを伝えるだけです。 get() または getValue() メソッドで変更できます。しかし、変更リスナーを登録した場合は、式は直ちに再評価され、そのプロパティにバインドされているものはすべて変更を反映します。

JavaFXはこれらのプロパティをWPFと同様にgetとsetプロパティとプロパティラッパーのインスタンスを返すメソッドで公開します(WPFのプロパティのように静的なものではありません)。

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

A.Add(B,C)です。

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

これらの式はかなり複雑になることがあります。 a = (b + c) * (d - e) といった具合で、任意の数のプロパティを含むことができます。Fluent API はかなり読みやすく、使いやすいですが、Microsoft ライブラリのいくつかによって提供される Fluent API のいくつかほど良くありません。

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

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

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

プロパティとバインディングの紹介は、以下のページにあります。 を参照してください。 .

スタイル

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

JavaFXはまた、他の場所で定義して使用できる変数など、CSSを向上させるのに役立ついくつかの追加機能を提供します。

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

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

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

JavaFXのCSSでは タイプ を定義することはできません(これを書いている時点では、すべてのレイアウトはコードで実行する必要があります)。これは、HTML で CSS を使用する際に私を苦しめた CSS の 1 つの側面であったため、私にとっては非常に効果的です。

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

JavaFX CSSのガイドがあります。 はこちらです。 .

レイアウト

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

前述の通り、LayoutはCSSでは行えませんが、コードやFXMLで表現したり、シーンビルダーで作成(最終的にはFXMLに変換)することが可能です。

コントロール

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

コントロールは、CSS に実装固有の領域をいくつか公開し、コントロールの特定の領域をスタイルでターゲットにすることができます。これは 部分構造 と呼ばれます。例: a CheckBox は二つの部分構造を公開します; ボックスとチェックマークで、コントロールの各部分が独立してスタイル付けされるようにします。先に説明したように look のみが CSS を使用して変更可能であり feel は変更できません。例) TabPane は、その内部レイアウトパネルを変更することで、WPFの TabControl .

これはかなり限定的に聞こえますが、JavaFXでカスタムコントロールを作成する好ましい方法は、標準コントロールを配置するためにレイアウトパネルから派生し、CSSを使用してそれらを再スタイリングするという線に沿って、構成を使用することであるようです。

結論

全体として、私はJavaFXが現在提供しているものに非常に感銘を受けています。WPFほど成熟していないものの、活発に開発されており、Oracleは確かにこれを支援しているようです。成功するかどうかは時間が解決してくれるでしょう。

私は、JavaFXを試してみることをお勧めします。以下を読んでください。 ドキュメント を読んで、小さなアプリケーションを組み立ててみて、どう思うかを見てください。

また FXエクスペリエンス・ドットコム をご覧ください。このサイトは、開発チームからの情報を定期的に更新しています。