如何将子组件和新属性添加到自定义JavaFX控件?
发布时间:2020-12-15 04:11:12 所属栏目:Java 来源:网络整理
导读:我想创建一个新的 JavaFX组件并在FXML中使用它.如何定义此组件的使用可能性和子类型?有没有办法为这个组件创建我自己的atrributes?例如,这就是我想要的: MyNewComponent specificAttribute="..." children SpecificChildren/SpecificChildren /children/M
我想创建一个新的
JavaFX组件并在FXML中使用它.如何定义此组件的使用可能性和子类型?有没有办法为这个组件创建我自己的atrributes?例如,这就是我想要的:
<MyNewComponent specificAttribute="..."> <children> <SpecificChildren></SpecificChildren> </children> </MyNewComponent> 解决方法
当您设置属性的值或在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 reference,因为上述建议有一些例外情况,具体取决于您尝试设置的值的类型,并且可能需要一些额外的代码才能使其正常工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |