前言

在使用了FXML设计布局后,新的问题随之而来,当一个程序需要多个界面时,我们不可能在一个FXML中写出全部布局,这样太过于臃肿不易查看和维护(当然非要这么做也是可以的),这里就涉及到如何在一个FXML中添加另一个FXML以及多个FXML对应Controller类之间的通讯。经过查阅发现方法还不止一个,这里分别例举一下吧。

本文目录

1. 方式1

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<String, Object> controllers = new HashMap<String, Object>(); @Override
public void start(Stage primaryStage) throws Exception {
Parent root = new FXMLLoader(getClass().getClassLoader().getResource("resources/main.fxml")).load();
primaryStage.setScene(new Scene(root));
primaryStage.show();
} public static void main(String[] args) {
launch();
}
}

如此,在partController.java定义如下属性:

private mainControl controller= (mainControl) main.controllers.get(mainControl.class.getSimpleName());

那么在partController中,我们就可以使用controller.xxx调用partController中的公有属性和方法了。

此例与上例没有直接关系


方式2

在使用过程中,我们可以发现,方法1虽然可以实现通信,但是并不好用,这里就要介绍方法2了。同样的,还是先从FXML中添加FXML说起。查了资料发现通过属性可以直接实现...

同样的以上面项目结构为例,在main.fxml中添加part.fxml有如下伪代码:

mian.fxml

<AnchorPane fx:id="root" fx:controller="java.controller.mainController" prefHeight="400.0" prefWidth="600.0">
<children>
<fx:include fx:id="part" source="TitlesBar.fxml"/>
</children>
</AnchorPane>

这样就行了,接下来接着看通信,注意这里前后是连着的,不像上一个方法,前后没有直接关系。

mainController.java中,设置如下属性:

    @FXML
private partController partController;

那么在mainController中,我们就可以使用partController.xxx调用partController中的公有属性和方法了。

 

注意,这里属性名partController是根据上一步设置的<fx:include>中设置的fx:id来的,格式为id+Controller,如id为'text',则此处应为

    @FXML
private partController textController;

格式不对会报错无法使用的


完事,结论很明确,方式2更好

参考文章:[https://blog.csdn.net/qq_20336817/article/details/80055701)

(本文最后更新于2020.3.14,原创文章,转载请注明)

JavaFX之多个FXML加载和通信的更多相关文章

  1. IDEA--错误:找不到或无法加载XXXXX--解决方法--创建javafx或其他项目出现的问题

    今天一上午超厂长在学习javafx的时候,总是创建一个然后运行就会出现 出现错误:找不到或无法加载主类 找了二个小时,都说是jdk或者其他环境配置问题 按照那些改了也没用重新创建一个也提示出现错误:找 ...

  2. JVM类加载器是否可以加载自定义的String

    前言 曾经有一次,面试官问到类加载机制,相信大多数小伙伴都可以答上来双亲委派机制,也都知道JVM出于安全性的考虑,全限定类名相同的String是不能被加载的.但是如果加载了,会出现什么样的结果呢?异常 ...

  3. JVM之类加载器、加载过程及双亲委派机制

    JVM 的生命周期 虚拟机的启动 Java 虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实 ...

  4. 百度推出新技术 MIP,网页加载更快,广告呢?

    我们在2016年年初推出了MIP,帮助移动页面加速(原理).内测数据表明,MIP页面在1s内加载完成.现在已经有十多家网站加入MIP项目,有更多的网站正在加入中.在我们收到的反馈中,大部分都提到了广告 ...

  5. 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密

    下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...

  6. 高性能Javascript--脚本的无阻塞加载策略

    Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 .原因是,事实上,大多数浏览器使用单进程处理U ...

  7. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  8. Bootstrap-Select 动态加载数据的小记

    关于前端框架系列的可以参考我我刚学Bootstrap时候写的LoT.UI http://www.cnblogs.com/dunitian/p/4822808.html#lotui bootstrap- ...

  9. 按需加载.js .css文件

    首先,理解按需加载当你需要用到某个js里面的函数什么鬼,或者某个css里的样式的时候你才开始加载这个文件. 然后是怎样实现的,简单来说就是在js中动态的createElem<script> ...

随机推荐

  1. Mysql————基本sql语句

    mysql中的基本语法有四种: 1.DDL语句:(用CREAT和DROP操作的语句) 用于创建.修改.和删除数据库内的数据结构,如:1:创建和删除数据库(CREATE DATABASE || DROP ...

  2. [LC] 300. Longest Increasing Subsequence

    Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...

  3. [LC] 225. Implement Stack using Queues

    Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...

  4. 吴裕雄--天生自然HTML学习笔记:HTML 段落

    HTML 可以将文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>这是一个段落 </p> <p>这是另一个段落< ...

  5. Mybatis-Plus的分页插件

    使用的是:Mybatis-Plus的分页插件https://baomidou.gitee.io/mybatis-plus-doc/#/?id=%E7%AE%80%E4%BB%8B 1.Mapper.j ...

  6. 思科WLC5508上传定制Portal展示模版

    1. 登录Cisco设备,获取模板样例登录cisco WLC设备后点击help,打开帮助文档Wireless Tab-->Web Login Page-->External Web Aut ...

  7. js 中 == 和 === 的区别

    js中的 ==和===的区别 简单理解 js 是弱类型的语言,其中 == 可以理解为 是值是否相等,而===不仅比较值是否相等,还比较类型是否相等. 简单案例: var str = "1&q ...

  8. 通用 mapper的简单使用

    通用 MAPPER的简单使用 官方  https://mapperhelper.github.io/docs/2.use/ 依赖 <dependency> <groupId>t ...

  9. es6 转载

    1.let命令 1)let和var的区别:let声明的变量只有所在的代码块有效. 2)没有变量的提升,一定要声明后使用.使用let命令声明变量之前,该变量都是不可用的.形成“暂时性死区”. 3)typ ...

  10. [PHP] 报错和“@” - 工作

    以下几点关于报错和@的关系理解 在PHP中使用@加在某个语句前面,可以抑制错误在脚本的执行过程中输出到IO: 如果在某个语句上使用了@,则可以将语句内的各种嵌套的脚本可能存在的报错都会被抑制住: 如果 ...