为什么您的代码无法正常工作
加载器创建了一个新的AnchorPane,但您没有将新面板添加到场景图中的父级。
快速修复
请改为:
content = (AnchorPane) FXMLLoader.load("vista2.fxml")
编写:
content.getChildren().setAll(FXMLLoader.load("vista2.fxml"))
用新的视图替换内容的子项。 内容本身仍然在场景图中,因此当您设置其子项时,同时也将它们附加到场景图上。
您可能需要调整布局(例如使用自动调整大小的布局,如StackPanes而不是AnchorPanes)来获取所需的确切行为。
建议您不要只采用快速修复方法,而是建议您查看下面链接的简单框架,因为它可能为您提供了更通用的机制来获取您想要的行为。
参考FXML导航框架
我创建了一个小型框架,用于在主场景的一部分中交换fxml受控内容窗格。
该框架的机制与kithril的答案中提供的相同。
- 用于外部fxml的主面板作为子面板的持有者。
- 外部fxml的主控制器提供了一个公共方法,可以用于交换子面板。
- 方便的导航器类以主布局的主控制器静态初始化。
- 导航器通过调用主控制器上的方法,为主容器加载新的子面板提供了一个公共静态方法。
- 子面板是由其各自的fxml加载器生成的。
为什么要使用框架
该框架似乎对于回答您的问题来说有些过度,或许是这样。 但是,我发现与FXML相关的两个最常问的话题是:
- 在FXML生成的窗格之间导航(本问题)。
- 如何在FXML控制器之间传递数据。
因此,我认为为这种情况提供一个小型演示框架是有必要的。
示例框架输出
第一个画面显示应用程序布局,显示第一个视图。 内容包括主应用程序布局中定义的标题和一个可互换的蓝色子内容窗格。
![vista1](https://istack.dev59.com/UorFq.webp)
在下一个画面中,用户已导航到第二个视图,该视图保留主布局中的常量标题,并使用新的珊瑚色子内容窗格替换原始子项。 新的子项已从新的fxml文件中加载。
![vista2](https://istack.dev59.com/UGlaV.webp)
寻找更实质性的东西?
比本问题中提供的示例框架更全面且得到更好支持的轻量级框架是afterburner.fx。
寻找更简单的东西?
只需交换场景根:在JavaFX中更改场景。
其他选项?
动画转换和其他选项:在JavaFX中切换