------
##前言
在使用了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