gpt4 book ai didi

controller - JavaFX8 FXML Controller 注入(inject)

转载 作者:行者123 更新时间:2023-12-02 09:31:47 25 4
gpt4 key购买 nike

在我的 GUI 应用程序中,我有两个 View :playlistView.fxmlvideoView.fxml。每个都有自己的 Controller 。我希望 playListView 成为 videoView 布局的一部分,所以我使用:

<fx:include fx:id="idPlayListAnchorPane" source="playListView.fxml" />

包含文件。工作正常,播放列表显示为 videoView 布局的一部分。

然后我将 idPlayListAnchorPane FXML 变量注入(inject)到 VideoViewController 中,如下所示:

@FXML
private AnchorPane idPlayListAnchorPane;

也可以。例如,我可以通过以下方式禁用 VideoViewControllerplayListView 中的 idPlayListAnchorPane:

idPlayListAnchorPane.setDisable(true);

要获取我使用的 playListViewController:

FXMLLoader loader = new FXMLLoader(Main.class.getResource("/designer/views/video/playListView.fxml"));
PlayListViewController playListViewController = new PlayListViewController();
loader.setController(playListViewController);
try {
AnchorPane playListView = (AnchorPane) loader.load();
} catch (IOException e) {
};

然后我可以调用例如:

playListViewController.init();    

来自 videoViewController

但是 init() 方法在 playListView ListView 中创建了一些测试值(作为单独的应用程序测试并且有效)。但是,这些测试值现在不会显示在 ListView 中。许多小时后的简单问题是:为什么不呢?

最佳答案

您正在加载 playListView.fxml文件两次:一次来自 <fx:include>当你创建 FXMLLoader 时在代码中调用 load() . AnchorPane 创建的节点层次结构(即 <fx:include> 及其所有内容)显示在您的 GUI 中;由 FXMLLoader.load() 创建的电话不是。

由于您创建的 Controller 与未显示的节点层次结构相关联,因此您在 Controller 上调用的方法不会影响您的 UI。

而不是创建 FXMLLoader要获取 Controller 实例,您可以将包含的 FXML 中的 Controller 直接注入(inject)到您的 VideoViewController 中。使用 Nested Controller文档中描述的技术。

为此,首先添加一个 fx:controller属性给你的 playListView.fxml根元素:

播放 ListView .fxml:

<!-- imports etc -->
<AnchorPane fx:controller="com.mycompany.packagename.PlayListViewController">
<!-- etc etc -->
</AnchorPane>

既然你有一个 fx:id="idPlayListAnchorPane"在您的 <fx:include ...> 上定义的属性,您可以将 Controller 直接注入(inject) VideoViewController使用 @FXML 上课- 名为 idPlayListAnchorPaneController 的注释字段(规则是您将“Controller”附加到 id):

public class VideoViewController {
@FXML
private AnchorPane idPlayListAnchorPane;
@FXML
private PlayListViewController idPlayListAnchorPaneController ;

// ...
}

现在您可以根据需要调用 Controller 上的方法。

关于controller - JavaFX8 FXML Controller 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32407666/

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