2つのカスタムスキンでいくつかのJavaFXコントロールを実装しています。私はいくつかの基本的なコントロールを持っていて、それぞれに2つの異なるスキンと、これらの2つを一緒にグループ化するコントロールを持っています。私は今、コンポジットコントロールの2つのスキンがあるはずです。組み込みコントロールの1つを適用すると、コンポジットコントロールのスキンを同じ方法でスキンしたいときに、コンポジットコントロールのスキンをどのように実装できますか?また皮をむいてください。基本的には、コントロールグラフにスキンを再帰的に適用したいと思っています。すべてのJavaFX子コントロールにスキンを適用
class Control1 extends Control {}
class Control1Skin1 extends SkinBase<Control1> {}
class Control1Skin2 extends SkinBase<Control1> {}
class Control2 extends Control {}
class Control2Skin1 extends SkinBase<Control1> {}
class Control2Skin2 extends SkinBase<Control1> {}
class CompositeControl extend Control {
private final Control1 ctrl1 = new Control1();
private final Control2 ctrl2 = new Control2();
}
class CompositeControlSkin1 extends SkinBase<Control1> {}
class CompositeControlSkin2 extends SkinBase<Control1> {}
- 皮膚のコントロールのメンバーを確認します。これはコードの複製につながり、そこに属していない肌にロジックを移動させます。
- アクセサーを
CompositeControl
に追加すると、埋め込みコントロールにアクセスできます。これにより、カプセル化が中断されます。 - メンバーパッケージをプライベートにして、スキンがスキンにアクセスし、スキンを適切に設定できるようにします。カプセル化のマイナーな違反ですが、スキンとコントロールクラスは結局凝集性のクラスターを形成します。
- サブコントロールのスキンを返すメソッドを持つカスタム
CompositeControlSkin
インターフェイスを定義します。次に、新しいインターフェースにCompositeControl.setSkin(Skin skin)to cast the
skin`パラメーターをオーバーライドし、スキンを取得して設定しなければなりません。これは、3のようにメンバーにアクセスする必要がありますが、さらにダウンキャストされます。私はこれがアプローチを不適格と思う。
JavaFXでより良いアプローチがあるかどうか疑問に思っています。複合スキン私が見つけたカスタムのスキン可能なコントロールに関するドキュメントは少し疎ですので、リンクやヒントに感謝します。
「CompositeControl」は、特に「Control1」と「Control2」をカプセル化するために作られているため、絶対に密接に結合されています。さらに、 'CompositeControlSkin#'は 'CompositeControl'にのみ適用できるので、' CompositeControl'のネストされたクラスであるかもしれないので、 'ctrl1'と' ctrl2'を含むprivateメンバーにアクセスできます。 – Itai
私はそれに同意できると思います。複合コントロールのスキンのためにJavaFXフレームワークに何らかのサポートがあるのだろうかと思います。 – Jens