加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

model-view-controller – JavaFX在没有控制器的fxml中包含fxml

发布时间:2020-12-15 04:45:28 所属栏目:Java 来源:网络整理
导读:我正在使用 javafx编写应用程序. 这是一个“多屏幕”应用程序,带有一个主菜单,可以从中切换场景. 我的场景在不同的fxml文件中定义. 因为我尝试使用mvc模式我没有在fxml文件中设置控制器,我在FXMLloader上使用setController. 一切都运行正常,但我在单独的控制
我正在使用 javafx编写应用程序.
这是一个“多屏幕”应用程序,带有一个主菜单,可以从中切换场景.

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

因为我尝试使用mvc模式我没有在fxml文件中设置控制器,我在FXMLloader上使用setController.

一切都运行正常,但我在单独的控制器和单独的fxml文件中有onmen的mainmenu及其所有功能.

我试过了

<fx:include source="Menubar.fxml"/>

并为fxml文件创建了一个控制器,当我在fxml文件中设置控制器时,我无法编译源代码.如何为包含的fxml文件设置控制器?

startpage.fxml获取其控制器“Startpage”

FXMLLoader loader = new FXMLLoader(getClass().getResource("../fxml/startpage.fxml"));
        loader.setController(new Startpage(m));
        Pane mainPane = loader.load();

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

解决方法

我认为你需要在加载器中使用controllerFactory来实现你想要的东西.当您使用controllerFactory时,您在FXML文件中指定控制器的类名,但控制器工厂允许您控制如何映射到对象(因此您仍然可以构建它在模型中传递等).为FXMLLoader指定controllerFactory时,该工厂还用于为FXML文件中的任何< fx:include>创建控制器.

最后,请注意,您可以将包含的fxml文件的控制器注入“main”fxml文件,如“Nested controllers” section of the FXML documentation中所述.

所以如果startpage.fxml看起来像这样:

<!-- imports etc -->
<BorderPane fx:controller="com.example.Startpage" ... >
  <top>
    <fx:include source="Menubar.fxml" fx:id="menubar" />
  </top>
  <!-- etc ... -->
</BorderPane>

和Menubar.fxml看起来像

<!-- 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 ;
    }

    // ...
}

因此主控制器现在具有对菜单栏控制器的引用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读