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> ...
随机推荐
- PostgreSQL中实现更新默认值(二)
今天我们用表继承+触发器的方案,来实现表中的更新默认值.这也许是PostgreSQL里最佳的解决方案. 一. 创建一张表,作为父表 create table basic_update( t_updat ...
- 关于AI行业创业的6个问题
第一个问题:互联网 vs 人工智能 首先如果今天大家选择创业,我建议更应该关注人工智能,而非互联网.为什么这么讲? 1. 互联网的流量红利已经消失: 以PC来说,全球PC出货量连续5年下滑.大家知道国 ...
- 【Linux_Shell 脚本编程学习笔记四、监控系统内存并报警企业案例脚本】
前置知识:awk 参考学习博客:https://www.cnblogs.com/bugingcode/p/8287914.html awk 'BEGIN{ commands } pattern{ co ...
- Session深入浅出
Session会在浏览器关闭后消失吗? 通常情况下,当我们关闭浏览器再重新打开后,我们就需要再次进行登陆(如果没有进行下次自动登录之类的设置).在Jav中(Session是通用的,这里以Java为例) ...
- [LC] 14. Longest Common Prefix
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
- OpenCV Canny 边缘检测
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #i ...
- 中心极限定理|z分布|t分布|卡方分布
生物统计学 抽样分布:n个样本会得到n个统计量,将这n个统计量作为总体,该总体的分布即是抽样分布 根据辛钦大数定律,从一个非正态分布的总体中抽取的含量主n的样本,当n充分大时,样本平均数渐近服从正态分 ...
- SpringMVC 数据校验(JSR-303)
项目中,通常使用较多的是前端的校验,比如页面中js校验以及form表单使用bootstrap校验.然而对于安全要求较高点建议在服务端进行校验. 服务端校验: 控制层controller:校验页面请求的 ...
- ACID原则
ACID原则是数据库事务正常执行的四个,分别指原子性.一致性.独立性及持久性. 事务的原子性(Atomicity)是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如 ...
- Flask从负到零的一周
新的一年,因为似乎要做很多的数据库,准备入坑Flask.开了一次讨论,我感觉自己燃起来了.于是,先买了一个号角状的水杯压压惊.目前通过一周的艰辛努力,终于做了一个小网站,支持数据库增删改查,算是从零到 ...