JavaFX之多个FXML加载和通信
前言
在使用了FXML设计布局后,新的问题随之而来,当一个程序需要多个界面时,我们不可能在一个FXML中写出全部布局,这样太过于臃肿不易查看和维护(当然非要这么做也是可以的),这里就涉及到如何在一个FXML中添加另一个FXML以及多个FXML对应Controller类之间的通讯。经过查阅发现方法还不止一个,这里分别例举一下吧。
本文目录
方式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加载和通信的更多相关文章
- IDEA--错误:找不到或无法加载XXXXX--解决方法--创建javafx或其他项目出现的问题
今天一上午超厂长在学习javafx的时候,总是创建一个然后运行就会出现 出现错误:找不到或无法加载主类 找了二个小时,都说是jdk或者其他环境配置问题 按照那些改了也没用重新创建一个也提示出现错误:找 ...
- JVM类加载器是否可以加载自定义的String
前言 曾经有一次,面试官问到类加载机制,相信大多数小伙伴都可以答上来双亲委派机制,也都知道JVM出于安全性的考虑,全限定类名相同的String是不能被加载的.但是如果加载了,会出现什么样的结果呢?异常 ...
- JVM之类加载器、加载过程及双亲委派机制
JVM 的生命周期 虚拟机的启动 Java 虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实 ...
- 百度推出新技术 MIP,网页加载更快,广告呢?
我们在2016年年初推出了MIP,帮助移动页面加速(原理).内测数据表明,MIP页面在1s内加载完成.现在已经有十多家网站加入MIP项目,有更多的网站正在加入中.在我们收到的反馈中,大部分都提到了广告 ...
- 探真无阻塞加载javascript脚本技术,我们会发现很多意想不到的秘密
下面的图片是我使用firefox和chrome浏览百度首页时候记录的http请求 下面是firefox: 下面是chrome: 在浏览百度首页前我都将浏览器的缓存全部清理掉,让这个场景最接近第一次访问 ...
- 高性能Javascript--脚本的无阻塞加载策略
Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 .原因是,事实上,大多数浏览器使用单进程处理U ...
- 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)
首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...
- Bootstrap-Select 动态加载数据的小记
关于前端框架系列的可以参考我我刚学Bootstrap时候写的LoT.UI http://www.cnblogs.com/dunitian/p/4822808.html#lotui bootstrap- ...
- 按需加载.js .css文件
首先,理解按需加载当你需要用到某个js里面的函数什么鬼,或者某个css里的样式的时候你才开始加载这个文件. 然后是怎样实现的,简单来说就是在js中动态的createElem<script> ...
随机推荐
- 2)header的使用
header() 函数向客户端发送原始的 HTTP 报头. 认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 以及更高的版本中,您可以使用输出缓存来解决此问题 ...
- 吴裕雄--天生自然python学习笔记:python文档操作批量替换 Word 文件中的文字
我们经常会遇到在不同的 Word 文件中的需要做相同的文字替换,若是一个一个 文件操作,会花费大量时间 . 本节案例可以找出指定目录中的所有 Word 文件(包含 子目录),并对每一个文件进行指定的文 ...
- css样式表----------样式属性(背景与前景、边界和边框、列表与方块、格式与布局)
一.背景与前景 (1).背景 line-height: 1.5 !important;">90; /*背景色(以样式表为主,样式表优先.)*/ background-image:url ...
- python、anaconda、jupyter notebook、pycharm、spyder
说明: 1.anaconda把任何东西都当做包来管理. 2.anaconda本省集成了python和conda.spyder.numpy等. 3.pip只用于python,conda可用于多种语言. ...
- Halcon算子函数
Chapter_1_:Classification 1.1 Gaussian-Mixture-Models 1.add_sample_class_gmm 功能:把一個訓練樣本添加到一個高斯混合模型的 ...
- Torque:轻应用背后的大蓄势 微软语音技术厚积薄发
Torque,为中国用户而来 此前,"微软车库"公开发布了一系列小而美的产品,它们全部由具有"极客创新"精神的微软员工在工作之外的时间构思和开发.Torque就 ...
- com.spotify:docker-maven-plugin 报localhost:2375 Connection refused 错误
当用maven build项目时出现了如下错误: Failed to execute goal com.spotify:docker-maven-plugin:0.4.13:build (defaul ...
- <NOIP2005提高T2>过河の思路
emm又一道dp dp真有趣(你的良心呢?!!! Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一 ...
- Python爬虫实战之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...
- 为啥Waymo和Uber间的官司,这么难界定?
自动驾驶作为被众多巨头和创业者看好的技术及领域,已有众多企业涉足其中.在自动驾驶尚未完全落地.制定统一标准前,每家企业都在争分夺秒地进行研发,试图率先抢占自动驾驶的高地.毕竟一旦成功,就能够创造巨大的 ...