gpt4 book ai didi

model-view-controller - JavaFX 在没有 Controller 的 fxml 中包含 fxml

转载 作者:行者123 更新时间:2023-12-04 08:38:00 24 4
gpt4 key购买 nike

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

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

因为我尝试使用 mvc 模式,所以我没有在 fxml 文件中设置 Controller ,所以我在 FXMLloader 上使用了 setController。

一切正常,但我在单独的 Controller 和单独的 fxml 文件中有主菜单及其 onActions 的所有功能。

我试过了

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

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

startpage.fxml 获取其 Controller “起始页”
FXMLLoader loader = new FXMLLoader(getClass().getResource("../fxml/startpage.fxml"));
loader.setController(new Startpage(m));
Pane mainPane = loader.load();
startpage.fxml包括 menubar.fxml ,现在如何为菜单栏控件设置 Controller ?或者如何轻松地将 menubarController 包含在每个其他 Controller 中?

最佳答案

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

最后,请注意您可以将包含的 fxml 文件的 Controller 注入(inject)到“主”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>

然后你可以控制 Controller 类的实例化:
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();

现在,如果需要,您实际上在应用程序代码中引用了这两个 Controller ,但您也可以这样做
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 ;
}

// ...
}

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

关于model-view-controller - JavaFX 在没有 Controller 的 fxml 中包含 fxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29256848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com