当前位置: 首页 > 面试题库 >

在同一场景中加载新的fxml

郤立果
2023-03-14
问题内容

我有2个fxml文件:

布局(标题,菜单栏和内容)
Anchorpane(应该放在另一个fxml文件的内容中)
我想知道如何从“主”场景将第二个文件加载到内容空间内。在javaFX中工作是一件好事,还是加载一个新场景更好?

我正在尝试做这样的事情,但是不起作用:

@FXML
private AnchorPane content;

@FXML
private void handleButtonAction(ActionEvent event) {        
    content = (AnchorPane) FXMLLoader.load("vista2.fxml");
}

谢谢您的帮助。


问题答案:

为什么您的代码不起作用

加载程序会创建一个新的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控制器之间传递数据
因此,我觉得这种情况下需要一个小型演示框架。

样本框架输出

第一个屏幕显示了显示第一个远景的应用程序布局。内容是在主应用程序布局中定义的标头,以及aliceblue可互换的子内容窗格。



 类似资料:
  • null 我正试着做这样的事情,但它不起作用: 谢谢你的帮助。

  • 接口说明 将数据整合到一个地方进行查询,Wish3DEarth团队新增了添加场景的接口,来进行数据的整合操作 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/scene/1.0.0/add 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 title string form 是 场景名称 descrip

  • 问题内容: 我正在构建JavaFX应用程序,我想知道是否有关于如何尽快加载当前新内容的建议(最佳实践)。 当前我正在做的(或多或少)是这样的: 对于加载简单的s,es等的复杂场景而言,上面的方法对于简单的s BUT 来说足够好且快速。 我在的方法中进行的所有初始化。 在那里,我将项目添加到框中,进行初始化等,但是正如我所说的,这花费了太多时间。 难道我做错了什么?我应该在其他地方初始化吗? 谢谢。

  • 所以我有一个游戏对象,它会在必要时加载新场景。附加到游戏对象的脚本有一个变量,该变量保存对画布元素的引用(画布元素有一个进度条)。问题是,在我加载一个新场景并且我想在加载的场景中加载一个新场景后,我失去了对画布对象的引用,因为我无法将他设置为DontDestRoyOnLoad。 我所做的是我把画布元素(参见start函数()中的注释行)作为游戏对象的子元素,它不会被销毁...在我这样做之后,我没有

  • 我的程序有两个场景,,每个都有相应的控制器类。 我希望能够使用Stage的在我的秒控制器类上,在它使用Button的onAction事件和FXMLLoader加载到FirstController类之后。 这是我在秒控制器类上的代码片段: 基于我的第一个控制器类上的,其中的值是一个字符串。 然而,这会输出一个错误: 然后,在第一个控制器类加载第二个控制器类之后,如何在其上使用?