2016-11-11 17 views
0

this answerを見ながら学んだことを使って、私はカスタムペインを実装したいと思います。 BackgroundEffectPaneと呼ばれるこのペインの主な目的は、効果を得て背景にのみ適用することです。これにより、リンクされた回答の半透明の背景StackPaneをはるかにクリーンな方法で実装することができます。JavaFXでペインを拡大する

これまでのところ、PaneNodeのドキュメントを読んだことがあります。これまでは、これを可能な限りきれいにするために上書きする明白な方法はありませんでした。関連性があると私を殴る唯一の事はペインのgetChildren()メソッドです。

これは上書きするのが適切ですか?

ペインはサブクラスの正しいクラスですか?

TLDR:カスタムペインを作成しようとしていますが、どのメソッドをオーバーライドしますか。私がしようとしているのは、バックグラウンドにエフェクトを加えることだけです。

答えて

1

私はこれのための方法を上書きしません。あなたがこの機能を提供StackPaneのサブクラスを作成したい場合は、単にコンストラクタでgetChildren().addAll(...)を呼び出す:もちろん

public class BackgroundEffectPane extends StackPane { 

    public BackgroundEffectPane(Node content) { 
     getChildren().addAll(createBackground(), freeze(...), content); 
    } 

    // code refactored from other answer... 
} 

を、今はもう、本当にすべてでサブクラス化する必要はありません:

public class BackgroundEffectPane { 

    private final Node content ; 

    private final Parent effectPane ; 

    public BackgroundEffectPane(Node content) { 
     this.content = content ; 
     this.effectPane = new StackPane(createBackground(), freeze(...), content); 
    } 

    public Parent getEffectPane() { 
     return effectPane ; 
    } 

    // other code... 
} 

ましたエフェクトを使用してペインの基礎となる実装を公開しないことで、クラスをよりよくカプセル化します(つまり、APIはStackPaneを使用していることを公開しません)。

+0

どちらの場合でも、「BackgroundEffectPane」の内部動作に干渉しているユーザーフォームが停止することはありません。彼らはいつも私が戻ってきたツリー、親、またはコンストラクタのいずれかを使いこなすことができます。 –

+1

後者の場合、「親」は子供の変更不可能なリストしか公開しないので、ダウンキャスト(基本的に信仰の飛躍)が必要ですが、一般的にはそうです。しかし、2番目の方法は、それを使った他のコードを壊さずに実装を変更できるようにする柔軟性があります(あなたは常にそのバージョンの 'StackPane'を使うことを約束していません)。 –

+1

サブクラス化アプローチを本当に使いたい場合は、 'Region'のサブクラス化と' layoutChildren() 'と' Pref/Min/MaxWidth/Height'メソッドのオーバーライドを検討してください。 –

関連する問題