5

我想创建一个新的 JavaFX 组件并在 FXML 中使用它。如何定义此组件的使用可能性和子组件类型?有没有办法为这个组件创建我自己的属性?例如,这就是我想要得到的:

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

1 回答 1

9

当您在 FXML 中设置属性值或指定子值时,您基本上只是在对象上设置属性。通常属性用于简单的标量值,嵌套值用于设置更复杂的值。

当 FXML 解析器遇到小写属性或标记时,它会假定该值是一个属性,并将尝试在特定对象上设置它。

例如,考虑一个从该类派生Parent并覆盖该getChildren()方法的自定义类,使其成为控件公共 API 的一部分。

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 回答