6

私は WPF の経験が豊富で、JavaFX 2.0 は初めてです。Silverlight プロジェクトを JavaFX 2.0 に移行しようとしています。2 つの Apress の本といくつかのスレッドでは、私の質問に答えることができませんでした (私の WPF が期待に影響を与えたため、答えを見たり理解したりできなかったのかもしれません)。

私が必要としているのは、RadioButton 機能を備えたコントロールですが、まったく異なる UI です。私の RadioButton には、テキスト、画像、ボタンなし、テキストの下の線 (長方形) があります。RadioButton が選択されていない場合、テキストと画像は透明になり、画像はグレースケールになり、四角形は表示されません。選択すると、テキストと画像が不透明になり、画像に色が付き、四角形が表示されます (すべてアニメーションによって変化します)。

既存の JavaFX 2.0 コントロールをスキンする方法は知っていますが、この方法で RadioButton をスタイル/スキンする方法がわかりません。

WPF では、RadioButton スタイルの新しいテンプレートを作成するだけです...前述のように、JavaFX 2.0 に対するこれらの WPF の影響を受けた期待が私のハードルです。

ありがとう...

編集:

既存のコントロール用に別のテンプレートを作成することはできないようです (?): JavaFX 2.0 render controls inside control

では、RadioButton を実装する最良の方法は何でしょうか? トグルグループが気になる…

4

1 に答える 1

5

JavaFX コントロールのスタイル設定またはテンプレート化には、さまざまな方法があります。

  1. ビルド済みの JavaFX コントロールは、cssを介してスタイルを設定できます。

  2. 事前構築済みの JavaFX コントロールをサブクラス化して、機能やルック アンド フィールを変更することもできます。例として、整数のみを編集するようにカスタマイズされた TextField を作成する IntField があります。

  3. 多くの場合、既存のコントロールの束をレイアウトPaneまたはGroupにまとめて配置することで、カスタム コンポーネントを構築できます。融合コンポーネントを構築するメソッドまたはクラスをパラメータ化することにより、コードを使用してカスタム コンポーネント構築を効果的にテンプレート化できます。これは、そのような方法を使用して構築された (および css を介してスタイル設定可能な)デジタルおよびアナログ時計コンポーネントの例です。

  4. また、 fxml ドキュメントの概要のアプローチを使用して、さまざまな fxml ファイルを介してカスタム コンポーネントのレイアウトを管理することもできます。fxml は、velocityなどのテンプレート言語を使用して生成することも、さまざまなレイアウト用にいくつかの異なる静的 fxml ファイルを作成することもできます。静的または生成された fxml は、必要に応じて動的に生成された html サイトのように、Web サーバーから動的に提供することもできます。

  5. カスタム コントロールを構築するもう 1 つの方法は、JavaFX チームが行っているのと同じ方法です (コントロールのスキンおよび動作クラスを作成することにより)。JavaFX 2.2 以降 (およびおそらく将来の JavaFX バージョンでも)、これは、 jfxtrasに取り組んでいる人や、JavaFX プロジェクト のオープン ソース コントロール リポジトリに直接貢献している人など、ライブラリ作成者に最も適しています。

  6. また、css では、コントロールのスキン クラスを指定できることにも注意してください。たとえば、RadioButton には次の css があります。

    。ラジオボタン {
        -fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin";
    }

したがって、考慮している RadioButton の外観をカスタマイズする 1 つの方法は次のとおりです。

  1. 前にリンクしたオープン ソースの JavaFX リポジトリから、RadioButtonSkinクラス ソースのコピーを取得します。
  2. それを新しいクラス名にコピーします (例: LinedRadioButtonSkin)。
  3. 希望の外観になるように変更します。
  4. プロジェクト用のカスタム CSS スタイルシートを作成します。
  5. カスタム css スタイルシートで、新しい LinedRadioButtonSkin クラスを使用するようにクラスの-fx-skin属性を設定します。.radio-button

新しいスキンが正しく実装され、既存の RadioButtonSkin クラスの動作と同様に既存のButtonBehaviourクラスに接続されている限り、既存のラジオ ボタンと同じ新しいスキン ベースのラジオ ボタンの動作が自動的に取得されます。たとえば、ボタンは、既存の RadioButtonSkin とまったく同じように、マウス クリック、キーボード アクセラレータ、タッチ イベント、ToggleGroups との対話などに応答し、既存のRadioButton API を使用してアクセスできます。つまり、ボタンは RadioButton のフィール (動作) を保持しますが、異なる内部コンポーネント、レイアウト、CSS スタイルを使用することで、まったく異なるものにすることができます。

カスタム スキン ルートに進むことに決め、このプロセスで支援が必要な場合は、jfxtras チームのメンバーに連絡して、新しいスキンを jfxtras プロジェクトに寄付することを検討してください。

警告

JavaFX 2.2 の Skin クラスと Behavior クラスはプライベート実装 API であり、公的にサポートされている API ではなく、パブリック API (JavaFX の次のメジャー リリース - JavaFX/JDK 8 で予定されている) に移行するにつれて、将来変更される予定です。今日は、慎重に行ってください。それらがパブリック API に移行したら、これらのクラスを使用して独自のコントロールを作成する方法について、より多くの情報とチュートリアルが表示されることを期待しています。

パッケージ名と API メソッドは、Skin と Behavior から独自のコントロールを構築するための API が内部プライベート実装からパブリック API に移行するにつれて変更されます。たとえば、にcom.sun.javafx.scene.control.behavior.BehaviorBaseなる可能性がjavafx.scene.control.behavior.Behaviorあるため、BehaviorBase を拡張するクラスを作成した場合、クラスのソースを変更して新しい名前と API を参照し、再コンパイルするまで、JavaFX の新しいバージョンに対して実行されません。

これと同じ理由で、API が公開されて最終版になるまで、このトピックに関する優れた本はありません。プライベート API に対して書かれた本に含まれるサンプル コードは、API が公開されるとすぐに古くなり、どちらも更新されないためです。パブリック API に対してコンパイルしたり、新しいバージョンの JavaFX に対して実行したりしないでください。

于 2012-09-13T00:23:06.800 に答える