当前位置: 首页 > 知识库问答 >
问题:

JavaFX在没有控制器的fxml中包含fxml

太叔鸿博
2023-03-14

我正在用JavaFX编写一个应用程序。这是一个“多屏”应用程序,有一个主菜单,我可以从那里切换我的场景。

我的场景是在不同的fxml文件中定义的。

<fx:include source="Menubar.fxml"/>
FXMLLoader loader = new FXMLLoader(getClass().getResource("../fxml/startpage.fxml"));
        loader.setController(new Startpage(m));
        Pane mainPane = loader.load();

startpage.fxml包含menubar.fxml,现在如何为menubar控件设置控制器?或者如何将menubarController轻松地包含在每个其他控制器中?

共有1个答案

裘兴思
2023-03-14

我认为您需要在加载器中使用ControllerFactory来实现您想要的功能。当您使用ControllerFactory时,您可以在FXML文件中指定控制器的classname,但是controller factory允许您控制如何将其映射到对象(因此您仍然可以通过模型等来构造它)。当为FXMLLoader指定ControllerFactory时,该工厂还用于为FXML文件中的任何 创建控制器。

最后,请注意,您可以将包含的fxml文件的控制器注入到“主”fxml文件中,如fxml文档的“嵌套控制器”部分所述。

因此,如果startPage.fxml如下所示:

<!-- imports etc -->
<BorderPane fx:controller="com.example.Startpage" ... >
  <top>
    <fx:include source="Menubar.fxml" fx:id="menubar" />
  </top>
  <!-- etc ... -->
</BorderPane>
<!-- imports etc -->
<MenuBar fx:controller="com.example.MenubarController" ... >
  <!-- etc... -->
</MenuBar>
FXMLLoader loader = new FXMLLoader(getClass().getResource("../fxml/startpage.fxml"));

Model m = ... ;

Startpage startpageController = new Startpage(m);
MenubarController menubarController = new MenubarController(m);

Callback<Class<?>, Object> controllerFactory = type -> {
    if (type == Startpage.class) {
        return startpageController ;
    } else if (type == MenubarController.class) {
        return menubarController ;
    } else { 
        // default behavior for controllerFactory:
        try {
            return type.newInstance();
        } catch (Exception exc) {
            exc.printStackTrace();
            throw new RuntimeException(exc); // fatal, just bail...
        }
    }
};

loader.setControllerFactory(controllerFactory);

Pane mainPane = loader.load();
public class Startpage {

    public final Model m ;

    // note the name of this field must be xController,
    // where x is the fx:id set on the <fx:include>:

    @FXML
    private final MenubarController menubarController ;

    public Startpage(Model m) {
        this.m = m ;
    }

    // ...
}

所以主控制器现在有一个对菜单栏控制器的引用。

 类似资料:
  • 问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为

  • 我试图在JavaFX中获得一个TableView来动态显示内容。 当我运行程序时,出现以下错误: 我的控制器名为“UserInterfaceController.java”,它与FXML文件在同一个包下,我也在FXML中导入了包。为什么找不到控制器? FXML文件: 控制器: 主要类:

  • 我有一个围绕JavaFXML和scenebuilder构建的简单的两个选项卡应用程序。这些选项卡目前什么都不做,因为我在尝试加载它们时无法通过null指针异常。 java和fxml文件安排在一个Netbeans项目中,如下所示: 主应用程序:应用程序主类MainApp。java设置场景并声明如下: MainController类为应用程序声明了两个选项卡,输入选项卡和帐户选项卡,以及一个用于关闭程

  • 更新 我试过很多解决办法,但都没有达到我的目标。应用程序加载UsersMainPageController,它只包含一个AnchorPane(类似于父控件),因此这是相关代码: [UsersMainPageController]

  • 我在相应的控制器中有一个用FXML创建的窗口,我有一个按钮,当单击特定的按钮时,它会加载一个小框。这个盒子也是使用FXML设计的。 当我加载盒子并想把它添加到窗口中时,我得到这个错误: 这是我的代码: 主窗口FXML: 我要动态创建的框的FXML:

  • 转换为fxml 我总是从javafx.fxml.loadException类型中得到错误代码:也许有比创建自定义类更好的解决方案。但我需要一个标签与自定义接口(连接)。也许另一个解决方案是创建一个只包含标签的fxml文件,并通过接口为此设置一个控制器类。 编辑:

  • 在JavaFX8中,有一个UI控件体系结构,用于创建自定义控件。基本上是基于: 控制。 皮肤。 新浪网. 此外,还有一个FXML项目的基本结构,也用于制作GUI。基本上: 控制。 FXML 文件。 新浪网. 我想将FXML与UI控件架构一起使用,所以我的问题是: 谁是FXML文件的控制器?皮肤? 我必须执行以下代码之类的操作?: