Fra*_*ank 2 controller fxml javafx-8
在我的GUI应用程序中,我有两个视图:playlistView.fxml和videoView.fxml.每个人都有自己的控制器.我希望playListView成为videoView布局的一部分,所以我使用:
<fx:include fx:id="idPlayListAnchorPane" source="playListView.fxml" />
Run Code Online (Sandbox Code Playgroud)
包含文件.工作正常,播放列表显示为videoView布局的一部分.
然后我将idPlayListAnchorPane FXML变量注入VideoViewController,如下所示:
@FXML
private AnchorPane idPlayListAnchorPane;
Run Code Online (Sandbox Code Playgroud)
也工作.例如,我可以禁用idPlayListAnchorPane在playListView从VideoViewController有:
idPlayListAnchorPane.setDisable(true);
Run Code Online (Sandbox Code Playgroud)
要获取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) {
};
Run Code Online (Sandbox Code Playgroud)
然后我可以打电话给例如:
playListViewController.init();
Run Code Online (Sandbox Code Playgroud)
来自videoViewController.
但init()方法在playListView ListView中创建了一些测试值(作为一个单独的应用程序进行测试,并且可以正常工作).但是,这些测试值现在不会显示在ListView中.几个小时后的简单问题是:为什么不呢?
您正在加载playListView.fxml文件两次:从<fx:include>创建内置FXMLLoader代码并调用一次和一次load().AnchorPane由<fx:include>GUI 创建的节点层次结构(即其及其所有内容)显示在GUI中; FXMLLoader.load()呼叫创建的那个不是.
由于您创建的控制器与未显示的节点层次结构相关联,因此您在控制器上调用的方法将不会对您的UI产生任何影响.
FXMLLoader您可以VideoViewController使用文档中描述的嵌套控制器技术将包含FXML的控制器直接注入到您的控制器实例中,而不是创建一个获取控制器实例.
为此,首先fx:controller向playListView.fxml根元素添加一个属性:
playListView.fxml:
<!-- imports etc -->
<AnchorPane fx:controller="com.mycompany.packagename.PlayListViewController">
<!-- etc etc -->
</AnchorPane>
Run Code Online (Sandbox Code Playgroud)
由于您已经fx:id="idPlayListAnchorPane"定义了一个属性<fx:include ...>,因此可以VideoViewController使用一个被@FXML注释的字段将控制器直接注入到类中idPlayListAnchorPaneController(规则是将"Controller"附加到id):
public class VideoViewController {
@FXML
private AnchorPane idPlayListAnchorPane;
@FXML
private PlayListViewController idPlayListAnchorPaneController ;
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在您可以根据需要调用控制器上的方法.
| 归档时间: |
|
| 查看次数: |
5037 次 |
| 最近记录: |