JavaFX之多个FXML加载和通信
以谶 人气:2
------
##前言
在使用了FXML设计布局后,新的问题随之而来,当一个程序需要多个界面时,我们不可能在一个FXML中写出全部布局,这样太过于臃肿不易查看和维护(当然非要这么做也是可以的),这里就涉及到如何**在一个FXML中添加另一个FXML**以及**多个FXML对应Controller类之间的通讯**。经过查阅发现方法还不止一个,这里分别例举一下吧。
**本文目录**
> **[1. 方式1](#1)**
>**[2. 方式2(推荐)](#2)**
---
方式1
这个方法也是我一开始使用的,原理上就是利用`FXMLLoader`加载FXML然后通过代码添加,假设现有JavaFx项目结构如下: ``` project │ └───java │ │ │ └───main.java │ │ │ └───controller │ ├──mainController.java │ ├──partController.java │ └───resources ├── main.FXML ├── part.FXML ``` 首先以正常情况加载`main.FXML`,那么对于part.FXML,可以在`mainController`的`initializable`方法中使用`FXMLLoader`方法从FXML中获取布局,再以代码方式添加到main布局中,有如下伪代码: ``` /** * mainController.java * 伪代码仅用作示例,无法运行 */ public class mainController implements Initializable { @FXML private GridPane root; private GridPane part; @Override public void initialize(URL location, ResourceBundle resources) { try { part=new FXMLLoader(getClass().getClassLoader().getResource("resources/part.fxml")).load(); root.add(part); } catch (IOException e) { e.printStackTrace(); } } } ``` --- 那么Controller之间的通信,同样以上方项目结构为例,假定需要在partController中和mainController实现通信,可以利用`HashMap`作为Controller容器来实现传递。我们有如下代码: mian.java ``` public class main extends Application { //创建一个Controller容器 public static Map加载全部内容