2017-09-12 6 views
0

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> {} 
  1. 皮膚のコントロールのメンバーを確認します。これはコードの複製につながり、そこに属していない肌にロジックを移動させます。
  2. アクセサーをCompositeControlに追加すると、埋め込みコントロールにアクセスできます。これにより、カプセル化が中断されます。
  3. メンバーパッケージをプライベートにして、スキンがスキンにアクセスし、スキンを適切に設定できるようにします。カプセル化のマイナーな違反ですが、スキンとコントロールクラスは結局凝集性のクラスターを形成します。
  4. サブコントロールのスキンを返すメソッドを持つカスタムCompositeControlSkinインターフェイスを定義します。次に、新しいインターフェースにCompositeControl.setSkin(Skin skin)to cast the skin`パラメーターをオーバーライドし、スキンを取得して設定しなければなりません。これは、3のようにメンバーにアクセスする必要がありますが、さらにダウンキャストされます。私はこれがアプローチを不適格と思う。

JavaFXでより良いアプローチがあるかどうか疑問に思っています。複合スキン私が見つけたカスタムのスキン可能なコントロールに関するドキュメントは少し疎ですので、リンクやヒントに感謝します。

+0

「CompositeControl」は、特に「Control1」と「Control2」をカプセル化するために作られているため、絶対に密接に結合されています。さらに、 'CompositeControlSkin#'は 'CompositeControl'にのみ適用できるので、' CompositeControl'のネストされたクラスであるかもしれないので、 'ctrl1'と' ctrl2'を含むprivateメンバーにアクセスできます。 – Itai

+0

私はそれに同意できると思います。複合コントロールのスキンのためにJavaFXフレームワークに何らかのサポートがあるのだろうかと思います。 – Jens

答えて

1

まず、追加のスキンが本当に必要かどうかを確認してください。スキンは、コントロールがデフォルトとは完全に違って見えるようにする場合にのみ必要です。 通常、CSSを使用してアプリケーションをスタイリングするだけで十分です。

private static final String DEFAULT_STYLE_CLASS = "my-control"; 

    [...] 

    public MyControl(){ 
     getStyleClass().setAll(DEFAULT_STYLE_CLASS); 
    } 

  1. すべてのスキンを変更できるカスタムコントロールは、特定のスタイルクラス

を持っている必要があります:あなたは本当に、追加のスキンは、次の手順を確認する必要があるという結論に達した場合

  1. 実際に追加のスキンが必要なコントロールを特定します。

これは、カスタムCSSで使用する

  • オーバーライドスキン(必要ではないかもしれないあなたの複合コントロール用などの追加スキン)あなたのすべてのコントロールのために真ではないかもしれません

    .my-control { 
        -fx-skin: "somepackage.skin.MyControlSkin2"; 
    } 
    

    高度にカスタマイズ可能で再利用性の高いコントロールが必要な場合は、コントロールを拡張してスキンを用意するだけでよいことに注意してください。

    ほとんどの場合、fx:root FXML構文を使用して再利用可能なコントロールを作成できます。例えば。複合コントロールがこれの候補になる可能性があります。

    カスタムスキン可能コントロールは、通常、コントロールを特定のルックアンドフィールに結びつけるため、他のコントロールでは構成されません。スキン可能なコンポジットコントロールを使用する場合は、ネストされたコントロールはコントロール内ではなくスキン内にある必要があります。

  • 関連する問題