我想知道如何将fx:include
与JavaFX Scene Builder结合使用,因此:
想象一下,我有BorderPane
(文件borderpane.fxml
)。在中心部分,我想放一个Label
,然而它应该在一个单独的FXML文件中定义,例如label.fxml
。
第一个问题:由于label.fxml
将被集成到容器(BorderPane)中,因此它本身不需要一个。{1}}。但是,SceneBuilder只提供创建布局作为容器的选项吗?
第二个问题:我可以手动创建label.fxml
,然后手动调整borderpane.fxml
以包含label.fxml
。然后,我可以使用SceneBuilder加载borderpane.fxml文件,没有任何问题。但是,当我现在更改标签的文字并选择“保存”时,不会修改label.fxml
,而是修改borderpane.fxml
,如下所示:
# borderpane.fxml
<fx:include source="label.fxml" text="the new label text" />
新标签文字应写入label.fxml
,而不是borderpane.fxml
,目前已完成。
我做错了吗?
SceneBuilder不打算与fx:include一起使用吗?
我想为我的部分GUI提供单独的控制器,我认为这在逻辑上是正常的,所以这个实际使用场景有望得到SceneBuilder的支持吗?
答案 0 :(得分:6)
似乎Scene Builder 2解决了你提到的问题。
第一个(已解决)问题:根节点不必是Pane
。例如,它可以是Label
第二个(已解决)问题:菜单File > Include > FXML...
可用于包含外部FXML文件。无法编辑包含的文件。无论如何,右键单击“文档”视图中的节点将显示“编辑包含文件”菜单项,该菜单项将打开该文件的另一个“场景生成器”窗口。
总之, Scene Builder 2正确处理fx:include
元素。
答案 1 :(得分:1)
我不知道使用场景构建器向嵌入式FXML控件添加节点的任何方法。
但是,您可以使用Java代码执行此操作。如果你的borderpane.fxml使用一个名为#setCentre的方法定义一个控制器来添加一个节点,那么你可以在borderpane.fxml的父控制器中加载label.fxml,并使用你定义的方法添加标签。
但有一个问题,您是在给出简化示例,还是实际为标签和边框窗格创建FXML文件?如果是这样,那么我认为这实际上会使你的程序比仅仅向更大的控件添加控件更复杂。