属性の値を設定したり、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 リファレンスを参照してください。設定しようとしている値のタイプによっては、上記のアドバイスにはいくつかの例外があり、機能させるには追加のコードが必要になる場合があります。