JavaFX-定义默认属性

JavaFX-定义默认属性,java,javafx,fxml,Java,Javafx,Fxml,我已经创建了一个自定义控件,它使用fx:root元素扩展区域。我的问题是,当我尝试加载它时,我得到一个LoadException,声称我需要定义一个DefaultProperty。据我所知,Region不会公开getChildren(),让开发人员决定客户端是否可以自由添加内容 我的问题是如何将子对象定义为默认属性?我试着阅读文档,但他们只说注释是用来做什么的,而不说它是如何使用的。我也找不到任何例子。每次我试图用@DefaultProperty注释字段或方法时,我只会得到编译错误注释@Defa

我已经创建了一个自定义控件,它使用
fx:root
元素扩展
区域
。我的问题是,当我尝试加载它时,我得到一个
LoadException
,声称我需要定义一个
DefaultProperty
。据我所知,Region不会公开
getChildren()
,让开发人员决定客户端是否可以自由添加内容

我的问题是如何将子对象定义为默认属性?我试着阅读文档,但他们只说注释是用来做什么的,而不说它是如何使用的。我也找不到任何例子。每次我试图用
@DefaultProperty
注释字段或方法时,我只会得到编译错误
注释@DefaultProperty不允许用于此位置

注释是类级注释(
@Target(value=TYPE)
)具有指定属性名称的必需的
属性

因此,以下措施将起作用:

@DefaultProperty("children")
public class SpecialRegion extends Region {

    @Override
    public ObservableList<Node> getChildren() {
        return super.getChildren();
    }
}
@DefaultProperty(“子项”)
公共类特殊区域扩展区域{
@凌驾
公共观察列表getChildren(){
返回super.getChildren();
}
}
请注意,如果不将
getChildren()
设为公共,则
fxmloader
将无法以允许其填充的方式访问它。因此,即使使用
@DefaultProperty
注释,我认为如果不将
getChildren()
方法
public
,也无法实现这一点,如上所述。此时,您还可以将
窗格
子类化,而不是
区域
:窗格和
区域
之间的唯一区别是
公共
方法和
默认属性
注释是类级注释(
@Target(value=TYPE)
在文档中),具有指定属性名称的必需的

因此,以下措施将起作用:

@DefaultProperty("children")
public class SpecialRegion extends Region {

    @Override
    public ObservableList<Node> getChildren() {
        return super.getChildren();
    }
}
@DefaultProperty(“子项”)
公共类特殊区域扩展区域{
@凌驾
公共观察列表getChildren(){
返回super.getChildren();
}
}
请注意,如果不将
getChildren()
设为公共,则
fxmloader
将无法以允许其填充的方式访问它。因此,即使使用
@DefaultProperty
注释,我认为如果不将
getChildren()
方法
public
,也无法实现这一点,如上所述。此时,您还可以将
窗格
子类化,而不是
区域
:窗格
区域
之间的唯一区别是
公共
方法和
默认属性
注释是类级注释(
@Target(value=TYPE)
在文档中),具有指定属性名称的必需的

因此,以下措施将起作用:

@DefaultProperty("children")
public class SpecialRegion extends Region {

    @Override
    public ObservableList<Node> getChildren() {
        return super.getChildren();
    }
}
@DefaultProperty(“子项”)
公共类特殊区域扩展区域{
@凌驾
公共观察列表getChildren(){
返回super.getChildren();
}
}
请注意,如果不将
getChildren()
设为公共,则
fxmloader
将无法以允许其填充的方式访问它。因此,即使使用
@DefaultProperty
注释,我认为如果不将
getChildren()
方法
public
,也无法实现这一点,如上所述。此时,您还可以将
窗格
子类化,而不是
区域
:窗格
区域
之间的唯一区别是
公共
方法和
默认属性
注释是类级注释(
@Target(value=TYPE)
在文档中),具有指定属性名称的必需的

因此,以下措施将起作用:

@DefaultProperty("children")
public class SpecialRegion extends Region {

    @Override
    public ObservableList<Node> getChildren() {
        return super.getChildren();
    }
}
@DefaultProperty(“子项”)
公共类特殊区域扩展区域{
@凌驾
公共观察列表getChildren(){
返回super.getChildren();
}
}

请注意,如果不将
getChildren()
设为公共,则
fxmloader
将无法以允许其填充的方式访问它。因此,即使使用
@DefaultProperty
注释,我认为如果不将
getChildren()
方法
public
,也无法实现这一点,如上所述。此时,您还可以将
窗格
子类化,而不是
区域
:窗格
区域
之间的唯一区别是
公共
getChildren()方法和
默认属性

,而这确实消除了
加载异常
,相反,我现在得到了
UnsupportedOperationException:无法确定属性的类型。尝试向控件添加节点时,请访问com.sun.javafx.fxml.BeanAdapter.getSetterMethod(未知源)
。我想这是因为没有setChildren方法。请参阅更新。。。我不确定有没有一种方法可以在不公开
getChildren()
的情况下做你想做的事情。另一个区别是一个区域有一个形状,你可以告诉它看起来像一个多边形。我想我可以通过添加一个多边形作为窗格的子对象来解决这个问题。不管怎样,你的回答解决了我最初的要求,所以我会接受的。谢谢虽然这确实消除了
LoadException
,但我现在得到的是
UnsupportedOperationException:无法确定属性的类型。尝试向控件添加节点时,请访问com.sun.javafx.fxml.BeanAdapter.getSetterMethod(未知源)
。我想这是因为没有setChildren方法。请参阅更新。。。我不确定有没有办法