5

新しい JavaFX コンポーネントを作成し、FXML で使用したいと考えています。このコンポーネントの子の使用可能性とタイプを定義するにはどうすればよいですか? このコンポーネントの独自の属性を作成する方法はありますか? 例として、これは私が取得したいものです:

<MyNewComponent specificAttribute="...">
   <children>
      <SpecificChildren></SpecificChildren>
   </children>
</MyNewComponent>
4

1 に答える 1

9

属性の値を設定したり、FXML で子の値を指定したりする場合、基本的にはオブジェクトのプロパティを設定するだけです。通常、属性は単純なスカラー値に使用され、入れ子の値はより複雑な値を設定するために使用されます。

FXML パーサーは、小文字の属性またはタグを検出すると、その値がプロパティであると見なし、特定のオブジェクトに設定しようとします。

例として、クラスから派生し、コントロールのパブリック API の一部になるようにメソッドParentをオーバーライドするカスタム クラスを考えてみます。getChildren()

public class MyNewComponent extends Parent {

    @Override
    public ObservableList<Node> getChildren() {
        return super.getChildren();
    }
}

このように、他のコントロールを FXML のカスタム コントロールに直接追加できるはずです。

<MyNewComponent>
    <children>
        <SpecificChildren></SpecificChildren>
    <children>
</MyNewComponent> 

これは、概念的に次の Java コードに似ています。

myNewComponent.getChildren().add(new SpecificChildren());

DefaultProperty次のような注釈でカスタム コントロール クラスを装飾することで、これをさらに改善できます。

@DefaultProperty(value = "children")
public class MyNewComponent extends Parent {

これにより、<Children></Children>タグを省略できるため、FXML を次のように更新できます。

<MyNewComponent>
    <SpecificChildren></SpecificChildren>
</MyNewComponent>

これによりコントロールがシーン グラフに追加されますが、その方法を指定していないため、実際には必要な場所にコントロールが表示されない可能性があることに注意してください (一部のレイアウト メソッドの実装を提供するか、から派生させる必要があります)。などのレイアウト ロジックが既にあるクラスVBox)。

同様に、属性は次のように定義できます。

@DefaultProperty(value = "children")
public class MyNewComponent extends Parent {

    @Override
    public ObservableList<Node> getChildren() {
        return super.getChildren();
    }

    public String setSpecificAttribute(String str) {
        // Do something here...
    }
}

そして、あなたのFXMLで:

<MyNewComponent specificAttribute = "ABC123">

概念的には次のようになります。

myNewComponent.setSpecificAttribute("ABC123");

詳細については、公式のFXML リファレンスを参照してください。設定しようとしている値のタイプによっては、上記のアドバイスにはいくつかの例外があり、機能させるには追加のコードが必要になる場合があります。

于 2013-07-07T22:38:39.343 に答える