【问题标题】:How to add children component and new attribute to custom JavaFX control?如何将子组件和新属性添加到自定义 JavaFX 控件?
【发布时间】:2013-06-11 21:43:56
【问题描述】:

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

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

【问题讨论】:

    标签: java javafx-2 custom-component


    【解决方案1】:

    当您在 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 {
    

    这允许您省略 &lt;Children&gt;&lt;/Children&gt; 标记,以便您的 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 reference 了解更多详细信息,因为根据您尝试设置的值的类型,上述建议有一些例外情况,并且可能需要一些额外的代码才能使其工作。

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 2015-04-18
      • 2013-01-09
      • 1970-01-01
      相关资源
      最近更新 更多