一个控制器到 2 个 fxmls (JavaFX)

Posted

技术标签:

【中文标题】一个控制器到 2 个 fxmls (JavaFX)【英文标题】:One controller to 2 fxmls (JavaFX) 【发布时间】:2022-01-22 14:32:52 【问题描述】:

是否可以将两个 FXML (JavaFX) 文件连接到一个控制器? 我不能通过在每个 FXML 文件中更改“fx:controller”来做到这一点......

有什么想法吗?

【问题讨论】:

可以对多个 FXML 文件使用相同的控制器类,但是您的代码将很难遵循,而且这是一个非常糟糕的主意。 (另请注意,使用fx:controller 属性,每次调用FXMLLoader.load(...) 时,您将拥有不同的控制器instance,即使您使用相同的控制器class。)为每个 FXML 文件使用不同的控制器类。 永远不需要多个 FXML 文件共享同一个控制器。如果您需要在控制器之间进行通信,请使用here 中描述的技术。 【参考方案1】:

是的,您可以这样做。虽然,可以做到,我不推荐这种方法

不要在任一 FXML 中放置 fx:controller 属性。创建一个新控制器并将同一个控制器设置为单独的 FXMLLoader 实例。

CustomerDialogController dialogController = 
    new CustomerDialogController(param1, param2);

FXMLLoader summaryloader = new FXMLLoader(
    getClass().getResource(
        "customerSummary.fxml"
    )
);
summaryLoader.setController(dialogController);
Pane summaryPane = (Pane) summaryLoader.load();

FXMLLoader detailsLoader = new FXMLLoader(
    getClass().getResource(
        "customerDetails.fxml"
    )
);
detailsLoader.setController(detailsController);
Pane detailsPane = (Pane) detailsLoader.load();

SplitPane splitPane = new SplitPane(
    summaryPane, 
    detailsPane
);

我想创建一个控制器,因为我在发送数据 beetwen 控制器时遇到问题

IMO 使用共享控制器来共享数据并不是首选的解决方案。

相反,可以在多个控制器之间共享数据,有关示例,请参阅:

Passing Parameters JavaFX FXML

这里还有一个例子:

JavaFX8 list bindings similar to xaml

更好,请参阅:

Applying MVC With JavaFx https://edencoding.com/mvc-in-javafx/

【讨论】:

【参考方案2】:

使用fx:root 构造而不是fx:controller。在Custom Components section of the FXML docs 中有解释。如果您想要更大的代码示例,我已经在 this example for my students 中使用过它。

使用这种方法,创建视图和控制器将变得更加容易和灵活。您将能够像在应用程序中的任何其他对象一样在控制器之间共享和连接数据(例如:通过构造函数或 setter 方法传递数据)。

如果您使用的是 SceneBuilder,您只需删除控制器引用并选中“使用 fx:root”框。然后按照示例中所示重新编写代码。

【讨论】:

以上是关于一个控制器到 2 个 fxmls (JavaFX)的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX作业[重复]

JavaFX Grid Pane按钮“获取”2个单元格

JavaFx 元素未绑定到 fx:id 上的控制器变量 [重复]

JavaFX 控制器类不工作

JavaFX:将控制台输出重定向到在 SceneBuilder 中创建的 TextArea

初始化后,在javafx中的控制器之间传递变量[duplicate]