Java FX 学习
声明:参考视频
一. Stage与Scene
- 舞台与场景:JavaFX应用程序将Ul容器定义为舞台(Stage)与场景(Scene)Stage类是顶级容器,它对应于窗体,其内容由Scene决定。Scene类是所有可视化内容的容器(container),可以把它看成是一张画布,上面绘制了用户可以看到的内容。
- Scene Graph 其实就是一颗多叉树,各种控件都是树中的节点。
- 控件树的节点支持事件响应。
- 最底层节点通常都是诸如按钮之类的控件也可以是Circle之类的图形。
- 拥有子树节点称为容器,在JavaFX中成为“布局(Layout)”.
- 这样做以后可以在窗口Stage中切换Scene从而实现随时切换页面,同时也可以新建Stage从而实现打开多个窗口。
二. Java FX MVC架构
- 多窗体通信
核心点:在MainClass初始化窗口时,将MainClass的引用传给相应窗口的控制器。之后在每个窗口的控制器中通过MainClass的引用完成从窗口的打开以及主从窗口的通信。
在主窗口中打开新的窗口: 在MainClass初始化主窗口时,可以将MainClass的引用传给相应从窗口的控制器,然后在主窗口的控制器中通过MainClass的引用调用打开的窗口的函数,从而打开新的窗口。
在从窗口中关闭从窗口: 在MainClass初始化从窗口时,将从窗口的stage传给从窗口的控制器,在从窗口的控制器中调用stage.close(),从而关闭从窗口。
主窗口接收从窗口的信息:在MainClass初始化从窗口时,将主窗口的控制器的引用传给从窗口的控制器,在从窗口的控制器中调用主窗口控制器的相应方法,从而在主窗口中显示信息。
从窗口接收主窗口的信息:在MainClass初始化从窗口时,将MainCLass的引用传给从窗口的控制器,在主窗口的控制器中通过MainCLass的引用的调用相应方法,从而在从窗口中显示信息。
demo下载
注意:在项目中加入资源时,将资源放在与包名同名的resources路径下,以此来方便使用资源文件。如下图所示在项目编译时,会将resources下的资源放到同名的包中。
三. 事件处理机制
- 事件响应模式:
- 传统的事件响应模式
- Lamda事件响应模式
- 声明式事件响应模式
//传统的事件响应模式
this.btn.setOnAction(new EventHandler<ActionEvent>() {@Overridepublic void handle(ActionEvent actionEvent) {welcomeText.setText("Hello World!");}});
//Lamda事件响应模式
private void getRandomInt(ActionEvent actionEvent){Random random = new Random();int i = random.nextInt();welcomeText.setText(String.valueOf(i));}
this.btn2.setOnAction(this::getRandomInt);// 声明式事件响应模式
//fxml文件中 onAction="#事件名" <Button fx:id="btn3" layoutX="229.0" layoutY="287.0" mnemonicParsing="false" onAction="#handleRandowm" text="声明式事件响应" />
@FXML
public void handleRandowm(ActionEvent actionEvent) {Random random = new Random();int i = random.nextInt();welcomeText.setText(String.valueOf(i));}
- 事件派发链
事件在控件树的传播流程成为事件派发连
(1)事件派发链,实际上是一个双向链表,由事件目标对象负责创建。
(2)事件触发时,事件对象在链中传送
(3)事件响应方法(分为EventFilter和EventHandler两类)接收事件对象作为参数。
如下图所示,
//统一事件处理方法,输出event对象相关属性值//有参数决定是否消费此事件private void handleAndConsumd(Event event,boolean isConsumd,String msg) {if (isConsumd) {event.consume();}String info =String.format("Type:%s,source:%s,target:%s,consume:%s,msg:%s",event.getEventType(), event.getSource(),event.getTarget(),event.isConsumed(), msg);System.out.println(info);}void initListener(){borderpane.addEventFilter(MouseEvent.MOUSE_PRESSED,event -> handleAndConsumd(event, true, "borderpane filter mouse pressed"));borderpane.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "borderpane handler mouse pressed"));vbox.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "vbox filter mouse pressed"));vbox.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "vbox handler mouse pressed"));circle.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "circle filter mouse pressed"));circle.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> handleAndConsumd(event, false, "circle handler mouse pressed"));}@Overridepublic void initialize(URL url, ResourceBundle resourceBundle) {initListener();}
三. JavaFX数据绑定机制及应用
-
JavaFX Bean Property: 包括get, set,以及property方法,JAVA FX Property具有动态监听property.addListner()和数据绑定property.bind()等特性。
-
JavaFX数据绑定的编程模式:
-
应用
分析:可以将变化的数据统一抽象为IntegerProperty,进行数据绑定,然后add 和sub只管更改IntergerProperty()(控件上有property属性的直接进行绑定,没有的话可以通过addListner()进行绑定)
IntegerProperty integerProperty = new SimpleIntegerProperty(0);@Overridepublic void initialize(URL url, ResourceBundle resourceBundle) {arc.setStartAngle(90);arc.setLength(-0);#绑定数据numLabel.textProperty().bind(integerProperty.asString());addBtn.disableProperty().bind(integerProperty.greaterThanOrEqualTo(100));subBtn.disableProperty().bind(integerProperty.lessThanOrEqualTo(0));integerProperty.addListener((observableValue, number, t1) -> {arc.setStartAngle(90);arc.setLength(-t1.intValue() * 3.6);bar.setProgress(t1.intValue() / 100.0);});}@FXMLpublic void sub(ActionEvent actionEvent) {integerProperty.set(integerProperty.get() - 10);}@FXMLpublic void add(ActionEvent actionEvent) {integerProperty.set(integerProperty.get() + 10);}
demo下载
四.Java FX实现MVVM架构
- 业务逻辑代码单独抽离抽离出来,
- view与ViewModel进行数据绑定
- 控制器调用业务逻辑代码进行相应。
demo下载
五.多线程
- Runnable 对象
对于比较耗时的任务,需要使用多线程技术,但对UI控件的修改必须在JavaFX application thread中执行,因此可以使用 Platform.runLater() 推送到JavaFx application thread中执行修改UI控件的任务。
Runnable task =()-> {try {//TODO: 执行耗时任务的代码Thread.sleep(1000);//Lambda表达式执行的任务,将会被推送到JavaFx application thread中执行//因此,里面可以有直接访问UI控件的代码Platform.runLater(()->{//TODO: 执行修改UI控件的代码});} catch (InterruptedException e) {// TODO Auto-generated catch block} };
- Task对象(有返回值)里面封装了updateMessage(),updateProgress()修改UI控件的函数。
相关文章:

Java FX 学习
声明:参考视频 一. Stage与Scene 舞台与场景:JavaFX应用程序将Ul容器定义为舞台(Stage)与场景(Scene)Stage类是顶级容器,它对应于窗体,其内容由Scene决定。Scene类是所有可视化内容…...

【走迷宫】
题目 DFS代码 #include<bits/stdc.h> using namespace std; const int N 110; int matrix[N][N]; int n, m; int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1}; int dis[N][N]; void dfs(int x, int y, int cnt) {if(cnt > dis[n-1][m-1]) return;if(x n-1 &&a…...
linux(debian)迁移var数据到已分配逻辑卷的物理盘
文章目录 0 背景1 查看当前情况1.1 查看磁盘空间1.2 列出所有可用块设备的信息,而且还能显示他们之间的依赖关系1.3 查看可用磁盘1.4 查看卷组 2 卷组中创建逻辑卷3 创建文件系统4 创建临时文件夹并挂载,然后备份源文件5 修改开机挂载配置5.1 查看原配置…...

【产品那些事】什么是应用程序安全态势管理(ASPM)?
文章目录 前言当前应用安全(AppSec)推进遇到的问题关于ASPM的定义 为什么需要ASPM:B端客户核心需求ASPM产品关键策略理想状态下的ASPMASPM与CSPM的区别国内外产品参考 前言 随着现代软件开发实践的快速演变,特别是在敏捷开发和 DevOps 的推动下…...

cocosUI多分辨率适配
需求:由于各个设备的分辨率和尺寸并不一样,所以需要一套适配系统去很好的针对不同的设备分辨率或尺寸进行适配,以给玩家一个很好的游戏体验。 目前的主流适配方案 目前,针对不同设备的适配,主流的方案通常包括以下几种…...

无法加载到主类
说明:记录一次项目启动错误,如下: 错误信息:错误: 找不到或无法加载主类 com.hezy.App 原因: java.lang.ClassNotFoundException: com.hezy.App 解决:首先,在项目中勾选这个,显示target文件夹 …...

深入理解Kafka核心设计与实践原理_03
深入理解Kafka核心设计与实践原理_03 03_消费者3.1消费者与消费者组3.2客户端开发3.2.1 必要的参数配置3.2.2 订阅主题与分区 草稿 03_消费者 与生产者对应的是消费者,应用程序可以通过KafkaConsumer来订阅主题,并从订阅的主题中拉取消息。不过在使用Ka…...
MySQL- 覆盖索引
覆盖索引(Covering Index)是 MySQL 中的一种优化技术,它能够显著提高查询性能。在使用覆盖索引的情况下,查询操作只需要访问索引即可获取所需的数据,而不必再访问表的实际数据行(即不需要回表)。…...

JSON与EXL文件互转
功能:实现json到excel文件的相互转换(支持json多选版) 目的:编码与语言对应,方便大家使用 页面设计: 介绍: 1.选择文件栏目选择想要转换的文件 2.生成路径是转换后文件所在目录 3.小方框勾选与不勾选分别代表exl到…...

后台管理权限自定义按钮指令v-hasPermi
第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…...
【Python绘制散点图并添加趋势线和公式以及相关系数和RMSE】
在Python中,绘制散点图并添加趋势线(通常是线性回归线)、公式、以及相关系数(Pearson Correlation Coefficient)和均方根误差(RMSE)可以通过结合matplotlib用于绘图,numpy用于数学运…...
linux bridge VLAN
TP-Link 支持 Linux 桥接(bridge)和 VLAN 功能的产品主要包括其高端的交换机和一些企业级路由器: TP-Link JetStream 系列交换机: TL-SG3424: 24端口千兆交换机,支持 VLAN 和桥接。TL-SG3210: 24端口千兆管理型交换机&…...
Java进阶篇之深入理解多态的概念与应用
引言 在Java面向对象编程(OOP)中,多态(Polymorphism)是一个关键概念,它允许相同类型的对象在不同的场景中表现出不同的行为。多态不仅增强了代码的灵活性和可扩展性,还极大地提高了代码的可维护…...
Linux下的进程调度队列
我们在进程那一篇讲到了操作系统时间片轮换调度的概念 那么Linux下具体是怎么调度的?...

统计回归与Matlab软件实现上(一元多元线性回归模型)
引言 关于数学建模的基本方法 机理驱动 由于客观事物内部规律的复杂及人们认识程度的限制,无法得到内在因果关系,建立合乎机理规律的数学模型数据驱动 直接从数据出发,找到隐含在数据背后的最佳模型,是数学模型建立的另一大思路…...

【项目】基于Vue3.2+ElementUI Plus+Vite 通用后台管理系统
构建项目 环境配置 全局安装vue脚手架 npm install -g vue/cli-init打开脚手架图形化界面 vue ui创建项目 在图形化界面创建项目根据要求填写项目相关信息选择手动配置勾选配置项目选择配置项目然后我们就搭建完成啦🥳,构建可能需要一点时间࿰…...
随机生成 UUID
1、随机生成 UUID主方法 /*** 随机生成 UUID* param {*} len 生成字符串的长度* param {*} radix 生成随机字符串的长度**/export function uuid_(len 30, radix 20) {var chars 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.split()var uuid [],ir…...

报名表EXCEL图片批量下载源码-CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
每次报名表都会包含大量照片,一张一张下载很慢 可以通过未来之窗开源平台架构 开开excel批量下载 实现代码也很简单 function 未来之窗下载(){ let 未来之窗地址 document.getElementById("batchurl").value; let 保存路径 document.getElementById(…...

SpringBoot 整合 Elasticsearch 实现商品搜索
一、Spring Data Elasticsearch Spring Data Elasticsearch 简介 Spring Data Elasticsearch是Spring提供的一种以Spring Data风格来操作数据存储的方式,它可以避免编写大量的样板代码。 常用注解 常用注解说明如下: 注解名称 作用 参数说明 Docu…...

计算机毕业设计 助农产品采购平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...