FXML中只读列表属性疑问:构造器为何影响children值?
FXML中自定义构造器影响children属性的原因
问题出在FXML加载器处理构造器和子元素的逻辑上:
- 用默认无参构造器时,FXML加载器会先创建对象,然后自动把FXML里配置的所有子元素(B、A、C)挨个加到children集合里,所以最终输出完整的
[B,A,C]。 - 用自定义带参构造器时,加载器会自动尝试把FXML里的子元素或属性匹配到构造器参数上。如果你的构造器参数类型和子元素类型能对上,加载器会把第一个子元素(也就是B)当作参数传给构造器,而不会把它加到children里;剩下的A、C也不会被自动添加——因为加载器默认认为构造器已经处理了子元素的初始化工作,跳过了后续的集合注入步骤。最后children里就只剩构造器中可能手动添加的B,也就是你看到的
[B]。
举个实际场景的例子:
假设你的MyPoint带参构造器是public MyPoint(Node initialChild),FXML里的配置是:
<MyPoint> <children> <Node fx:id="B"/> <Node fx:id="A"/> <Node fx:id="C"/> </children> </MyPoint>
加载器会直接把B传给构造器当参数,不会把B、A、C加到children里。除非你在构造器里手动写getChildren().add(initialChild),但就算加了,剩下的A、C也不会被自动注入,因为加载器已经跳过了children集合的处理。
如果想保留自定义构造器同时让children正常工作,可以这么做:
- 让构造器参数的类型不匹配子元素类型,或者用
<fx:construct>标签明确指定构造器参数,避免加载器乱匹配子元素; - 在构造器里手动初始化children集合,并且处理好参数对应的元素;
- 或者给类同时保留无参构造器,让FXML加载器用无参构造器实例化,再处理属性注入。
内容的提问来源于stack exchange,提问作者XiaoJiawei
相关产品推荐
相关产品推荐

