当前位置: 首页 > news >正文

java8 springboot 集成javaFx 实现一个客户端程序

1. 先创建一个springboot 程序(此步骤不做流程展示)

2. 更改springboot的版本依赖和导入所需依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.7</version><relativePath/> <!-- lookup parent from repository -->
</parent><properties><java.version>1.8</java.version><project.build.jdk>1.8</project.build.jdk>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--javafx--><dependency><groupId>de.roskenet</groupId><artifactId>springboot-javafx-support</artifactId><version>2.1.6</version></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--打包插件--><plugin><groupId>com.zenjava</groupId><artifactId>javafx-maven-plugin</artifactId><version>8.8.3</version><configuration><vendor>测试</vendor><mainClass>cn.mt4.follow.FollowOrderApplication</mainClass></configuration></plugin></plugins>
</build>

3.创建层级结构

3.1 在resources 目录下创建 fxml(可根据自己习惯更改) 文件夹 用于存放 .fxml 文件
3.2 在XXXApplication 主程序同一层级创建controller(可根据自己习惯更改) 和 view(可根据自己习惯更改) 文件夹

4. 编写代码

4.1 编写.fxml 文件内容(此文件是图形界面内容)
为了快速开发建议安装 JavaFX Scene Builder 2.0 工具,该工具可以进行拖拉拽的形式开发界面.例子:
在这里插入图片描述

图形界面画完之后 可以点击左上角的 File-> Save as 将内容保存为 .fxml 文件 ,并将此文件放到 resources 下的 fxml 文件夹中,博主这里命名为了LoginFxml.fxml ,示例代码如下所示:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.*?>
<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0"prefWidth="600.0"xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"fx:controller="cn.mt4.follow.controller.LoginController"><children><Label fx:id="accountLabel" layoutX="129.0" layoutY="122.0" text="账号:"><font><Font size="18.0"/></font></Label><Label fx:id="passwordLabel" layoutX="129.0" layoutY="188.0" text="密码:"><font><Font size="18.0"/></font></Label><TextField fx:id="accountField" layoutX="200.0" layoutY="116.0" promptText="请输入账号"><font><Font size="18.0"/></font></TextField><TextField fx:id="passwordField" layoutX="200.0" layoutY="182.0" promptText="请输入密码"><font><Font size="18.0"/></font></TextField><Button fx:id="loginButton" layoutX="335.0" layoutY="283.0" mnemonicParsing="false" text="登录"><font><Font size="18.0"/></font></Button><Button fx:id="resetButton" layoutX="170.0" layoutY="283.0" mnemonicParsing="false" text="重置"><font><Font size="18.0"/></font></Button></children>
</Pane>

注意 JavaFX Scene Builder 2.0 保存的.fxml 文件中是没有 fx:controller 和 fx:id 这两个内容的,需要自己填写.

4.2 分别在view 和 controller 文件夹中创建对应的类
view 类 需要继承 AbstractFxmlView 类,并使用@FXMLView 注解 与 对应的.fxml 文件做绑定.如以下示例:

package cn.mt4.follow.view;import de.felixroske.jfxsupport.AbstractFxmlView;
import de.felixroske.jfxsupport.FXMLView;@FXMLView(value = "/fxml/LoginFxml.fxml")
public class LoginView extends AbstractFxmlView {
}

controller 类 需要 实现 Initializable 接口 ,并重写 initialize 方法,如以下示例:

package cn.mt4.follow.controller;import de.felixroske.jfxsupport.FXMLController;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;import java.net.URL;
import java.util.ResourceBundle;@FXMLController
public class LoginController implements Initializable {@FXMLprivate TextField accountField;@FXMLprivate TextField passwordField;@FXMLprivate Button loginButton;/*** Called to initialize a controller after its root element has been* completely processed.** @param location  The location used to resolve relative paths for the root object, or*                  <tt>null</tt> if the location is not known.* @param resources The resources used to localize the root object, or <tt>null</tt> if*                  the root object was not localized.*/@Overridepublic void initialize(URL location, ResourceBundle resources) {loginButton.setOnAction(e -> {String accountFieldText = accountField.getText();String passwordFieldText = passwordField.getText();System.out.println("accountFieldText:" + accountFieldText);System.out.println("passwordFieldText:" + passwordFieldText);});}
}

注意: 这里 TextField 和 Button 导入的jar 包是 javafx.scene.control.*
accountField 等属性名与 .fxml 文件中fx:id 定义的名称保持一致

4.3 更改XXXApplication主程序的内容
需要继承 AbstractJavaFxApplicationSupport 类,示例代码:

package cn.mt4.follow;import cn.mt4.follow.view.LoginView;
import de.felixroske.jfxsupport.AbstractJavaFxApplicationSupport;
import javafx.scene.image.Image;
import javafx.stage.Stage;
import org.springframework.boot.autoconfigure.SpringBootApplication;import java.util.Collection;@SpringBootApplication
public class FollowOrderApplication extends AbstractJavaFxApplicationSupport {public static void main(String[] args) {launch(FollowOrderApplication.class, LoginView.class, args);
//        SpringApplication.run(FollowOrderApplication.class, args);}@Overridepublic void start(Stage stage) throws Exception {stage.setTitle("XXX管理系统");super.start(stage);}@Overridepublic Collection<Image> loadDefaultIcons() {return super.loadDefaultIcons();}
}

至此结束.运行main方法即可运行程序.

正式完成之后需要打包成 可执行文件 ,因在pom 中 导入了 javafx-maven-plugin 插件 ,所以可以在maven中 使用 双击 jfx:native 来打包,运行成功之后会在 target/jfx/native 目录中 生成 .exe 文件 .

相关文章:

java8 springboot 集成javaFx 实现一个客户端程序

1. 先创建一个springboot 程序(此步骤不做流程展示) 2. 更改springboot的版本依赖和导入所需依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.7</versio…...

MySQL(高级特性篇) 06 章——索引的数据结构

一、为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道理&#xff0c;进行数据查找时&#xff0c;首先查看查询条件…...

PanWeidb-使用BenchmarkSQL对磐维数据库进行压测

本文提供PanweiDb使用BenchmarkSQL进行性能测试的方法和测试数据报告。 BenchmarkSQL,一个JDBC基准测试工具,内嵌了TPC-C测试脚本,支持很多数据库,如PostgreSQL、Oracle和Mysql等。 TPC-C是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业…...

AR 在高校实验室安全教育中的应用

AR应用APP可以内置实验室安全功能介绍&#xff0c;学习并考试&#xff08;为满足教育部关于实验室人员准入条件&#xff09;&#xff0c;AR主模块。其中AR主模块应该包括图形标识码的扫描&#xff0c;生成相应模型&#xff0c;或者火灾、逃生等应急处置的路线及动画演示。考试采…...

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…...

Spring Boot中的配置文件有哪些类型

在 Spring Boot 中&#xff0c;配置文件用于管理应用程序的设置和参数&#xff0c;通常存放在项目的 src/main/resources 目录下。Spring Boot 支持多种类型的配置文件&#xff0c;并通过这些文件来控制应用的行为和环境配置。 1. application.properties application.proper…...

Spring Boot 项目启动后自动加载系统配置的多种实现方式

Spring Boot 项目启动后自动加载系统配置的多种实现方式 在 Spring Boot 项目中&#xff0c;可以通过以下几种方式实现 在项目启动完成后自动加载系统配置缓存操作 的需求&#xff1a; 1. 使用 CommandLineRunner CommandLineRunner 是一个接口&#xff0c;可以用来在 Spring…...

如何在 CentOS 中生成 CSR

在本教程中&#xff0c;我们将向您展示如何在CentOS 7和6中生成CSR。您可以直接从服务器生成 CSR。 只需按照以下步骤操作&#xff1a; 第 1 步&#xff1a;使用安全外壳 &#xff08;SSH&#xff09; 登录您的服务器 步骤 2&#xff1a;创建私钥和 CSR 文件 在提示符处键入以…...

qml XmlListModel详解

1、概述 XmlListModel是QtQuick用于从XML数据创建只读模型的组件。它可以作为各种view元素的数据源&#xff0c;比如ListView、GridView、PathView等&#xff1b;也可以作为其他和model交互的元素的数据源。通过XmlRole定义角色&#xff0c;如name、age和height&#xff0c;并…...

C++并发编程之跨应用程序与驱动程序的单生产者单消费者队列

设计一个单生产者单消费者队列&#xff08;SPSC队列&#xff09;&#xff0c;不使用C STL库或操作系统原子操作函数&#xff0c;并且将其放入跨进程共享内存中以便在Ring3&#xff08;用户模式&#xff09;和Ring0&#xff08;内核模式&#xff09;之间传递数据&#xff0c;是一…...

PostgreSQL技术内幕22:vacuum full 和 vacuum

文章目录 0.简介1.概念及使用方式2.工作原理2.1 主要功能2.2 清理流程2.3 防止事务id环绕说明 3.使用建议 0.简介 在之前介绍MVCC文章中介绍过常见的MVCC实现的两种方式&#xff0c;一种是将旧数据放到回滚段&#xff0c;一种是直接生成一条新数据&#xff08;对于删除是不删除…...

【网络】:网络编程套接字

目录 源IP地址和目的IP地址 源MAC地址和目的MAC地址 源端口号和目的端口号 端口号 VS 进程ID TCP协议和UDP协议 网络字节序 字符串IP和整数IP相互转换 查看当前网络的状态 socket编程接口 socket常见API 创建套接字&#xff08;socket&#xff09; 绑定端口号&…...

java基础概念55-不可变集合

一、定义 不可变集合&#xff1a;不可以被修改的集合&#xff0c;只能查询。&#xff08;长度、内容均不可被修改&#xff09; 二、创建不可变集合 【注意】&#xff1a; 此方法是在JDK9中引入的。 2-1、list不可变集合 示例&#xff1a; import java.util.List;public cla…...

深入理解 C++ 函数重载

在 C 中, 函数重载是一个非常强大的特性, 允许多个函数使用相同的名称, 但具有不同的参数类型. 重载解析决定了在给定的调用中, 编译器应选择哪个版本的重载函数. 本文将深入探讨 C 重载解析的工作原理, 帮助你在实际编程中更好地理解这一机制. 重载(Overload) vs 重写(Overri…...

相机和激光雷达的外参标定 - 无标定板版本

1. 实现的效果 通过本软件实现求解相机和LiDAR的外参&#xff0c;即2个传感器之间的三维平移[x, y, z]和三维旋转[roll, pitch, yaw]。完成标定后&#xff0c;可将点云投影到图像&#xff0c;效果图如下&#xff1a; 本软件的优势&#xff1a;&#xff08;1&#xff09;无需特…...

Redis 知识速览

文章目录 1. Redis 简介2. Redis 优缺点3. Redis 高性能4. Redis VM 机制5. Redis 数据类型6. 应用场景7. 持久化8. 过期策略9. 内存相关10. 线程模型11. 事务12. 集群 1. Redis 简介 定义&#xff1a;Redis 是一个用 C 语言编写的高性能非关系型&#xff08;NoSQL&#xff09…...

LeetCode 热题 100_从前序与中序遍历序列构造二叉树(47_105_中等_C++)(二叉树;递归)

LeetCode 热题 100_从前序与中序遍历序列构造二叉树&#xff08;47_105&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;递归&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;递归…...

使用sqlplus的easy connect时如何指定是链接到shared server还是dedicated process

在oracle配置了shared server的情况下 可以使用 :shared来指定链接到shared server也可以默认不指定 不指定的情况下会默认链接到shared server 如果想链接到 dedicated process 则必须显式指定链接到dedicated process server type的类型包括DEDICATED, SHARED, or POOLED. […...

ubuntu22.4 ROS2 安装gazebo(环境变量配置)

ubuntu版本&#xff1a;ubuntu22.4 最近在学习ROS2 视频教程古月居的入门课&#xff1a; 视频教程 文字笔记 问题 在学到关于Gazebo的时候&#xff0c;遇到下面问题&#xff1a; 运行 $ ros2 launch gazebo_ros gazebo.launch.py在这里卡住&#xff0c;不弹出gazebo 解决…...

【机器学习:十四、TensorFlow与PyTorch的对比分析】

1. 发展背景与社区支持 1.1 TensorFlow的背景与发展 TensorFlow是Google于2015年发布的开源深度学习框架&#xff0c;基于其前身DistBelief系统。作为Google大规模深度学习研究成果的延续&#xff0c;TensorFlow从一开始就定位为生产级框架&#xff0c;强调跨平台部署能力和性…...

百川2-13B-4bits开源大模型镜像免配置优势:内置check.sh脚本实现7维度健康检查

百川2-13B-4bits开源大模型镜像免配置优势&#xff1a;内置check.sh脚本实现7维度健康检查 1. 为什么说这个镜像"开箱即用"&#xff1f; 如果你之前部署过大语言模型&#xff0c;肯定经历过这些头疼事&#xff1a;环境配置报错、依赖包冲突、端口被占用、GPU显存不…...

VBA UserForm控件交互实战:跨窗体数据传递与动态更新

1. UserForm基础与跨窗体数据传递原理 刚接触VBA UserForm时&#xff0c;我经常被各种控件的交互问题困扰。特别是当需要多个窗体协同工作时&#xff0c;数据传递就成了大难题。记得有次做订单管理系统&#xff0c;主窗体收集客户信息&#xff0c;子窗体处理产品明细&#xff0…...

从“无风扇散热”到“完美机房”:我与AI的一场散热与存储深度对话

本文源于我与AI的一次技术探讨&#xff0c;从无风扇散热模组的工作原理出发&#xff0c;逐步深入到浸泡式液冷、热辐射优化、算力中心架构&#xff0c;最终延伸至存储介质的可靠性对比。这是一次从“芯片级散热”到“系统级存储”的完整技术认知之旅。前言&#xff1a;一个好奇…...

保姆级教学:用星图AI云平台快速搭建Clawdbot,让Qwen3-VL:30B接入飞书

保姆级教学&#xff1a;用星图AI云平台快速搭建Clawdbot&#xff0c;让Qwen3-VL:30B接入飞书 1. 为什么选择本地部署多模态办公助手&#xff1f; 在日常办公中&#xff0c;我们经常遇到需要处理图片和文字的场景&#xff1a; 同事发来的产品截图需要快速分析内容会议白板照片…...

人脸识别快速上手:Retinaface+CurricularFace镜像教程,简单易学

人脸识别快速上手&#xff1a;RetinafaceCurricularFace镜像教程&#xff0c;简单易学 1. 理解人脸识别黄金组合 在开始动手之前&#xff0c;我们先花两分钟了解Retinaface和CurricularFace这对黄金搭档&#xff1a; Retinaface&#xff1a;就像一位专业的摄影师&#xff0c…...

MiniCPM-o-4.5-nvidia-FlagOS开源镜像:FlagOS软件栈赋能的NVIDIA GPU原生推理方案

MiniCPM-o-4.5-nvidia-FlagOS开源镜像&#xff1a;FlagOS软件栈赋能的NVIDIA GPU原生推理方案 想快速体验一个能看懂图片、还能跟你聊天的AI助手吗&#xff1f;今天要介绍的MiniCPM-o-4.5-nvidia-FlagOS开源镜像&#xff0c;就是一个开箱即用的多模态AI解决方案。它基于FlagOS…...

Flux Sea Studio 极限测试:生成8K超高清巨幅海景壁纸的技术挑战与实现

Flux Sea Studio 极限测试&#xff1a;生成8K超高清巨幅海景壁纸的技术挑战与实现 最近在折腾AI生成图片&#xff0c;发现一个挺有意思的挑战&#xff1a;用Flux Sea Studio这类模型&#xff0c;能不能做出那种能铺满整块大屏幕的、细节拉满的8K超高清壁纸&#xff1f;特别是海…...

STM32F407 HAL库实战:TIM触发ADC+DMA实现多通道信号实时统计与可视化

1. 为什么需要TIM触发ADCDMA的多通道采集方案 在嵌入式数据采集系统中&#xff0c;实时性和效率往往是核心诉求。想象一下这样的场景&#xff1a;我们需要同时监测工业设备上的4个振动传感器&#xff0c;每个传感器的信号都需要以10kHz的频率采样。如果采用传统的轮询方式&…...

RMBG-2.0镜像免配置部署:无需配置Python环境,开箱即用Web交互界面

RMBG-2.0镜像免配置部署&#xff1a;无需配置Python环境&#xff0c;开箱即用Web交互界面 你是不是也遇到过这样的烦恼&#xff1f;想用AI模型给图片换个背景&#xff0c;结果光是安装Python环境、配置依赖库就折腾了大半天&#xff0c;最后还可能因为版本冲突、CUDA不兼容等问…...

Python原生AOT编译2026架构设计图(含C-API二进制兼容性矩阵+GC停顿压缩至≤80μs实证)

第一章&#xff1a;Python原生AOT编译2026架构全景概览Python原生AOT&#xff08;Ahead-of-Time&#xff09;编译在2026年已演进为一套融合语言语义、运行时契约与硬件感知能力的系统级基础设施。它不再依赖传统解释器或JIT中间态&#xff0c;而是通过静态类型推导、控制流图全…...