3

Introduction to FXMLには、<fx:root> を使用してカスタム コンポーネントを構築する方法の例があります。ドキュメントの一部を次に示します。

public CustomControl() {
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("custom_control.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
}

ここでは、コンストラクターが「this」をリークしており、不快な結果を引き起こす可能性があります。

コンストラクタで FXMLLoader に 'this' を渡しても安全ですか? そうでない場合、このコードを安全にするための提案はありますか?

4

1 に答える 1

1

この例はdocs.oracle.comのものであり、彼らがそれを使用して機能を説明しているという事実を考えると、安全であると言えます。それにもかかわらず、あなたは良い点を指摘しています。

できることは、ルートとコントローラーの両方を同時に表すクラスを回避することです。結局のところ、意味的には、それらを分離したほうがよいでしょう。したがって、上記の例では、CustomBox extends VBoxforfx:rootCustomBoxControllerasfx:controllerを使用して、代わりに .fxml に初期化の負担をかけることができます。

少なくとも、このような結合されたカスタム コントロールの周りにある種のラッパーを持つことができると思います。次に、ラッパーはコントロール オブジェクトを作成し、それを使用してローダーを初期化し、最後にそれをロードします。そのようなクラスが複数ある場合は、同じラッパーを使用してすべてのカスタム コントロールを初期化できます。

于 2015-05-05T17:52:14.060 に答える