零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
第十一章:实战项目 - 桌面应用开发(JavaFX入门)
欢迎来到我们实战项目的桌面应用开发部分!在前面的章节中,我们可能已经接触了Swing。现在,我们将目光投向JavaFX,一个更现代、功能更丰富的用于构建桌面应用的Java库。
1. JavaFX 简介
JavaFX是一个用于构建富客户端应用程序的Java平台。它最初是为了替代Swing而设计的,提供了更现代的UI控件、图形和媒体API、以及对CSS样式的支持。
1.1 JavaFX 与 Swing 的区别
- 外观与感觉:JavaFX应用通常具有更现代、更美观的界面。它支持CSS样式,使得定制UI变得更加灵活。
- 架构:JavaFX采用了一种基于场景图(Scene Graph)的架构,这使得处理复杂的2D和3D图形变得更容易。
- 并发性:JavaFX有更好的内置并发支持,可以更轻松地在后台线程执行任务而不会冻结UI。
- WebView:JavaFX包含一个基于WebKit的WebView组件,可以方便地在应用中嵌入Web内容。
- FXML:JavaFX引入了FXML,一种基于XML的标记语言,用于定义用户界面结构,从而实现UI设计与业务逻辑的分离。
1.2 为什么选择 JavaFX?
- 现代UI:如果你想创建具有现代感和良好用户体验的桌面应用,JavaFX是一个不错的选择。
- 强大的图形和媒体功能:JavaFX在处理图形、动画和多媒体方面表现出色。
- 社区支持:虽然Swing历史悠久,但JavaFX拥有一个活跃的社区,并且自Java 11以来,它已从JDK中分离出来,由OpenJFX社区维护和发展。
2. 搭建 JavaFX 开发环境
从Java 11开始,JavaFX不再包含在JDK中。你需要单独下载并配置JavaFX SDK。
2.1 下载 JavaFX SDK
你可以从 OpenJFX官网 下载适合你操作系统和JDK版本的JavaFX SDK。
2.2 配置IDE(以IntelliJ IDEA为例)
- 创建新项目:在IntelliJ IDEA中创建一个新的Java项目。
- 添加JavaFX库:
- 进入
File -> Project Structure -> Libraries
。 - 点击
+
号,选择Java
,然后导航到你下载的JavaFX SDK中的lib
文件夹,将其添加为项目库。
- 进入
- 配置VM选项(运行/调试配置时):
- 进入
Run -> Edit Configurations...
- 在
VM options
中添加:
将--module-path /path/to/javafx-sdk-xx/lib --add-modules javafx.controls,javafx.fxml
/path/to/javafx-sdk-xx/lib
替换为你JavaFX SDKlib
文件夹的实际路径。
- 进入
3. 第一个 JavaFX 应用:Hello JavaFX
让我们创建一个简单的JavaFX应用来显示 “Hello JavaFX!”。
3.1 创建主类
package com.example.javafxapp;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;public class HelloJavaFX extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {// 创建一个标签Label helloLabel = new Label("Hello JavaFX!");// 创建一个布局容器(StackPane会将子节点居中显示)StackPane root = new StackPane();root.getChildren().add(helloLabel);// 创建一个场景,并将布局容器放入场景中// 参数:根节点,场景宽度,场景高度Scene scene = new Scene(root, 300, 200);// 设置舞台(窗口)的标题primaryStage.setTitle("我的第一个JavaFX应用");// 将场景设置到舞台上primaryStage.setScene(scene);// 显示舞台primaryStage.show();}public static void main(String[] args) {// 启动JavaFX应用launch(args);}
}
代码解释:
Application
类:所有JavaFX应用都必须继承javafx.application.Application
类。start(Stage primaryStage)
方法:这是JavaFX应用的入口点。当应用启动时,JavaFX运行时会调用此方法。Stage
对象是顶级JavaFX容器,类似于Swing中的JFrame
。Label
:用于显示文本的控件。StackPane
:一种布局面板,它将其子节点堆叠在一起,默认居中显示。Scene
:场景是所有JavaFX内容的容器。一个Stage
包含一个Scene
。primaryStage.show()
:显示窗口。launch(args)
:Application
类中的静态方法,用于启动JavaFX应用。
3.2 运行应用
确保你的VM选项配置正确。然后运行 HelloJavaFX
类的 main
方法。你应该会看到一个标题为“我的第一个JavaFX应用”的窗口,窗口中央显示着“Hello JavaFX!”。
4. JavaFX 核心概念
4.1 Stage (舞台)
Stage
是JavaFX应用的顶级容器,代表一个窗口。一个应用可以有多个 Stage
。
4.2 Scene (场景)
Scene
是 Stage
内部内容的容器。它包含一个场景图(Scene Graph),这是一个由节点(Node)组成的树形结构。
4.3 Node (节点)
场景图中的所有元素都是节点。节点可以是:
- UI控件 (Control):如
Button
,Label
,TextField
等。 - 布局面板 (Layout Pane):如
StackPane
,VBox
,HBox
,GridPane
等,用于组织其他节点。 - 图形元素 (Shape):如
Rectangle
,Circle
等。 - 媒体元素 (MediaView):用于显示视频或音频。
4.4 布局面板 (Layout Panes)
JavaFX提供了多种布局面板来帮助你组织UI元素:
HBox
:水平排列子节点。VBox
:垂直排列子节点。BorderPane
:将区域划分为顶部、底部、左侧、右侧和中心。GridPane
:在网格中排列子节点。FlowPane
:当一行放不下时,自动换行排列子节点。StackPane
:堆叠子节点,常用于居中显示。
5. FXML:声明式UI设计
FXML是一种基于XML的标记语言,允许你以声明方式定义JavaFX用户界面。这使得UI设计与应用程序逻辑分离,提高了代码的可维护性。
5.1 创建 FXML 文件
一个简单的FXML文件可能如下所示 (hello_view.fxml
):
<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?><StackPane fx:controller="com.example.javafxapp.HelloController" xmlns:fx="http://javafx.com/fxml/1" alignment="CENTER"><children><Label text="Hello from FXML!" /></children>
</StackPane>
5.2 创建控制器类
控制器类 (HelloController.java
) 用于处理FXML中定义的UI元素的事件和逻辑:
package com.example.javafxapp;import javafx.fxml.FXML;
import javafx.scene.control.Label;public class HelloController {// 如果需要在Java代码中引用FXML中的元素,可以使用@FXML注解// @FXML// private Label myLabel;// 初始化方法,在FXML加载完成后调用@FXMLpublic void initialize() {System.out.println("Controller initialized!");}
}
5.3 加载 FXML 文件
在主应用类中加载FXML:
package com.example.javafxapp;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;import java.io.IOException;public class AppWithFXML extends Application {@Overridepublic void start(Stage primaryStage) throws IOException {// 加载FXML文件FXMLLoader loader = new FXMLLoader(getClass().getResource("hello_view.fxml"));Parent root = loader.load();primaryStage.setTitle("JavaFX App with FXML");primaryStage.setScene(new Scene(root, 300, 200));primaryStage.show();}public static void main(String[] args) {launch(args);}
}
确保 hello_view.fxml
文件位于与 AppWithFXML.java
相同的包路径下(或者在 resources
目录下并正确引用路径)。
6. 事件处理
JavaFX中的事件处理与Swing类似,但有一些JavaFX特有的方式。
6.1 使用 Lambda 表达式
Button myButton = new Button("点我!");
myButton.setOnAction(event -> {System.out.println("按钮被点击了!");
});
6.2 在 FXML 中指定事件处理器
FXML:
<Button text="Click Me" onAction="#handleButtonClick" />
Controller:
public class MyController {@FXMLprivate void handleButtonClick(ActionEvent event) {System.out.println("Button clicked via FXML!");}
}
7. JavaFX 常用控件
Label
: 显示文本。Button
: 用户可以点击的按钮。TextField
: 单行文本输入框。TextArea
: 多行文本输入框。CheckBox
: 复选框。RadioButton
: 单选按钮 (通常与ToggleGroup
一起使用)。ChoiceBox
: 下拉选择框。ComboBox
: 可编辑的下拉选择框。ListView
: 显示项目列表。TableView
: 显示表格数据。ImageView
: 显示图片。ProgressBar
/ProgressIndicator
: 显示进度。
8. 生活中的例子:一个简单的计算器
让我们构思一个简单的加法计算器。
- 界面:两个
TextField
用于输入数字,一个Label
用于显示结果,一个Button
用于执行计算。 - 布局:可以使用
VBox
或GridPane
。
FXML (calculator_view.fxml
):
<?xml version="1.0" encoding="UTF-8"?><?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?><VBox alignment="CENTER" spacing="10" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.javafxapp.CalculatorController"><padding><Insets bottom="20.0" left="20.0" right="20.0" top="20.0" /></padding><TextField fx:id="numField1" promptText="输入第一个数字" /><TextField fx:id="numField2" promptText="输入第二个数字" /><Button text="计算加法" onAction="#handleAddButton" /><Label fx:id="resultLabel" text="结果:" />
</VBox>
Controller (CalculatorController.java
):
package com.example.javafxapp;import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;public class CalculatorController {@FXMLprivate TextField numField1;@FXMLprivate TextField numField2;@FXMLprivate Label resultLabel;@FXMLprivate void handleAddButton() {try {double num1 = Double.parseDouble(numField1.getText());double num2 = Double.parseDouble(numField2.getText());double sum = num1 + num2;resultLabel.setText("结果: " + sum);} catch (NumberFormatException e) {resultLabel.setText("请输入有效的数字!");}}
}
主应用类 (CalculatorApp.java
):
package com.example.javafxapp;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;public class CalculatorApp extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {Parent root = FXMLLoader.load(getClass().getResource("calculator_view.fxml"));primaryStage.setTitle("简单加法计算器");primaryStage.setScene(new Scene(root, 300, 250));primaryStage.show();}public static void main(String[] args) {launch(args);}
}
这个例子展示了如何使用FXML定义界面,并使用控制器处理用户输入和更新UI。
9. 总结与下一步
JavaFX为开发功能丰富、界面现代的桌面应用提供了一个强大的平台。通过FXML,我们可以将UI设计与业务逻辑分离,使代码更易于管理。
下一步可以探索的内容:
- 更复杂的布局和控件。
- CSS样式定制。
- JavaFX动画和效果。
- 图表API (
javafx.scene.chart
)。 - 3D图形。
- 与外部服务集成。
继续练习,尝试构建自己的JavaFX应用,你会越来越熟练!
相关文章:
零基础学Java——第十一章:实战项目 - 桌面应用开发(JavaFX入门)
第十一章:实战项目 - 桌面应用开发(JavaFX入门) 欢迎来到我们实战项目的桌面应用开发部分!在前面的章节中,我们可能已经接触了Swing。现在,我们将目光投向JavaFX,一个更现代、功能更丰富的用于…...
Milvus 视角看主流嵌入式模型(Embeddings)
嵌入是一种机器学习概念,用于将数据映射到高维空间,其中语义相似的数据被紧密排列在一起。嵌入模型通常是 BERT 或其他 Transformer 系列的深度神经网络,它能够有效地用一系列数字(称为向量)来表示文本、图像和其他数据…...

leetcode:58. 最后一个单词的长度(python3解法)
难度:简单 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World"…...

虹科应用 | 探索PCAN卡与医疗机器人的革命性结合
随着医疗技术的不断进步,医疗机器人在提高手术精度、减少感染风险以及提升患者护理质量方面发挥着越来越重要的作用。医疗机器人的精确操作依赖于稳定且高效的数据通信系统,虹科提供的PCAN四通道mini PCIe转CAN FD卡,正是为了满足这一需求而设…...

entity线段材质设置
在cesium中,我们可以改变其entity线段材质,这里以直线为例. 首先我们先创建一条直线 const redLine viewer.entities.add({polyline: {positions: Cesium.Cartesian3.fromDegreesArray([-75,35,-125,35,]),width: 5,material:material, 保存后可看到在地图上创建了一条线段…...

[STM32] 5-1 时钟树(上)
文章目录 前言5-1 时钟树(上)时钟树的基本介绍时钟树的基本结构大树和小树频率运算简介计数器和分频STM32内部结构树的结构于关键节点SYSCLK(System Clock) 系统时钟 72M maxHCLK(AHB Clock) AHB时钟 36M maxPLCK(APB1 Clock) APB1时钟 36M maxPLCK2(APB…...

【Linux网络与网络编程】12.NAT技术内网穿透代理服务
1. NAT技术 之前我们说到过 IPv4 协议中IP 地址数量不充足的问题可以使用 NAT 技术来解决。还提到过本地主机向公网中的一个服务器发起了一个网络请求,服务器是怎么将应答返回到该本地主机呢?(如何进行内网转发?) 这就…...
【HTTPS基础概念与原理】TLS握手过程详解
以下是 TLS握手过程的详细拆解,涵盖客户端与服务器之间的关键交互步骤,包括ClientHello、ServerHello、证书验证、密钥交换等核心阶段,并对比TLS 1.2与TLS 1.3的差异: 一、TLS握手的核心目标 协商协议版本:确定双方支…...

从辅助到协作:GitHub Copilot的进化之路
如果说现代程序员的标配工具除了VS Code、Stack Overflow之外,还有谁能入选,那一定是GitHub Copilot。从2021年首次亮相,到如今深度集成进开发者日常流程,这个“AI编程助手”已经不只是写几行自动补全代码的小帮手了,而…...

Linux运行时的参数、命令、网络、磁盘参数和日志监控
一、监控 1. free 功能:用于查看系统内存使用情况,包括物理内存总量、已用内存、空闲内存、缓冲区(buffer)和缓存(cache)占用,以及交换内存(swap)的使用与剩余情况。常…...

鸿蒙页面布局入门
本文以仿猫眼电影M站首页布局为案例,展示ArkUI在实际开发中的应用。内容包括案例效果及相关知识点,深入解析布局框架以及头部、脚部、内容区域的构建思路与代码实现,最后提供完整代码和教程资源,助力你强化实践能力。 1. 案例效果…...
VTK|类似CloudCompare的比例尺实现2-vtk实现
文章目录 实现类头文件实现类源文件调用逻辑关键问题缩放限制问题投影模式项目git链接实现类头文件 以下是对你提供的 ScaleBarController.h 头文件添加详细注释后的版本,帮助你更清晰地理解每个成员和方法的用途,尤其是在 VTK 中的作用: #ifndef SCALEBARCONTROLLER_H #de…...

阿里巴巴开源移动端多模态LLM工具——MNN
MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练,并在设备端的推理和训练方面具有行业领先的性能。目前,MNN 已集成到阿里巴巴集团的 30 多个应用中,如淘宝、天猫、优酷、钉钉、闲鱼等,覆盖了直播、短视频…...

【漫话机器学习系列】256.用 k-NN 填补缺失值
用 k-NN 填补缺失值:原理、实现与应用 在实际的数据科学项目中,我们经常会遇到数据缺失(Missing Values)的问题。缺失值如果处理不当,不仅会影响模型训练,还可能导致最终结果偏差。 今天,我们…...
React组件(一):生命周期
文章目录 组件的生命周期生命周期的阶段1、组件创建阶段2、组件运行阶段3、组件销毁阶段 组件生命周期的执行顺序 组件的生命周期 在组件创建、到加载到页面上运行、以及组件被销毁的过程中,总是伴随着各种各样的事件,这些在组件特定时期,触…...

金格iWebOffice控件在新版谷歌Chrome中不能加载了怎么办?
金格iWebOffice控件是由江西金格网络科技有限责任公司开发的中间件软件,主要用于在浏览器中直接编辑Word、Excel、PowerPoint等Office文档,曾经是一款优秀国产的WebOffice插件。 由于2022年Chrome等浏览器取消支持PPAPI接口,导致这款金格iWe…...

实验6分类汇总
设计性实验 (1)查询每门课程的平均分,包括课程号和平均分。 SELECT Cno AS 课程号, AVG(Degree) AS 平均分 FROM Score065 GROUP BY Cno;(2)查询每门课程的平均分,包括课程号、课程名和平均分。 SELECT c.Cno AS 课程号, c.Cname AS 课程名, AVG(sc.Degree) AS 平均分 FROM …...

如何通过交流沟通实现闭环思考模式不断实现自身强效赋能-250517
感谢一直以来和我交流沟通的朋友们。 闭环思考 文字部分(25-05-04)这一天是青年节,在这一天与青年朋友交流这个是事先规划好的: “可以猜一猜,博士会被撤销吗?导师会被处理吗?千万不要回复,放心里,过段时间看结果,看看自己预估社会能力如何。 观察社会新闻,可以用…...

Python 3.11详细安装步骤(包含安装包)Python 3.11详细图文安装教程
文章目录 前言Python 3.11介绍Python 3.11安装包下载Python 3.11安装步骤 前言 作为当前最热门的编程语言之一,Python 3.11 不仅拥有简洁优雅的语法,还在性能上实现了飞跃,代码运行速度提升显著。无论是初入编程的小白,还是经验丰…...
[深度解析] 服务器内存(RAM)演进之路(2025):DDR5 vs HBM vs CXL 内存技术与选型指南
更多服务器知识,尽在hostol.com 嘿,各位服务器“发烧友”和技术决策者们!咱们在聊服务器配置的时候,CPU(大脑)、硬盘(仓库)、带宽(道路)这些“大件儿”总是备…...
C语言输入函数对比解析
目录 C语言输入函数全家福(和它们的秘密)fgetsgetsscanfgetcharfscanf函数对比表灵魂总结 哈哈,看来你正在和C语言的输入函数们玩“大家来找茬”!放心,我会用最接地气的方式给你讲明白,保证比看《甄嬛传》还…...
【Java-EE进阶】SpringBoot针对某个IP限流问题
目录 简介 1. 使用Guava的RateLimiter实现限流 添加Guava依赖 实现RateLimiter限流逻辑 限流管理类 控制器中应用限流逻辑 2. 使用计数器实现限流 限流管理类 控制器中应用限流逻辑 简介 针对某个IP进行限流以防止恶意点击是一种常见的反爬虫和防止DoS的措施。限流策…...

一个指令,让任意 AI 快速生成思维导图
大家好,我是安仔,一个每天都在压榨 AI 的躺平打工人。 今天分享一个 AI 办公小技巧,让你用一个指令让 AI 生成思维导图。 DeepSeek、Kimi、豆包都可以哈 ~ KimiXMind 安仔经常用 XMind 来绘制思维导图,但是 AI 是没…...
随言随语(十二):盖章
给自己的机器学习生涯做个总结盖个章,讲述下如何跟机器学习擦肩而过的,鉴于当前深度学习和大模型已经走出来的路及理论知识的入门难度,可能以后跟机器学习前沿科技就再没有交集了; 最近也看了马占凯的《ChatGPT:人类新…...

FPGA图像处理(六)------ 图像腐蚀and图像膨胀
默认迭代次数为1,只进行一次腐蚀、膨胀 一、图像腐蚀 1.相关定义 2.图像腐蚀效果图 3.fpga实现 彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法 timescale 1ns / 1ps // // Des…...
Spring三级缓存的作用与原理详解
在Spring框架中,Bean的创建过程涉及到了三级缓存机制。这个机制主要是为了提高单例模式下bean实例化和依赖注入的效率。本文将深入探讨Spring中的三级缓存,以及其在bean生命周期中的重要作用。 首先,让我们理解什么是三级缓存。Spring中的三…...

LVDS系列12:Xilinx Ultrascale系可编程输入延迟(二)
本节讲解Ultrascale IDELAYE3的参数; IDELAYE3参数: REFCLK_FREQUENCY:如果使用COUNT模式,保持300MHz的默认值即可; 如果使用TIME模式,则该值与IDELAYCTRL参考时钟要匹配; DELAY_SRC&#…...

ARM (Attention Refinement Module)
ARM模块【来源于BiSeNet】:细化特征图的注意力,增强重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 详解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增强特征表示的关键模块,它通过注意力机制来细化特征图&…...

国产免费工作流引擎star 6.5k,Warm-Flow升级1.7.2(新增案例和修复缺陷)
文章目录 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 主要更新内容 [feat] 开启流程实例,新增流程定义是否存在校验[feat] 新增合同签订流程案例[feat] 新增企业采购流程案例[update] mybatis-plus逻辑删除,删除值和未删除…...

前端二进制数据指南:从 ArrayBuffer 到高级流处理
前端开发中,二进制数据是处理文件、图像、音视频、网络通信等场景的基础。以下是核心概念和用途的通俗解释: 前端二进制数据介绍 1. 什么是前端二进制数据? 指计算机原始的 0 和 1 格式的数据(比如一张图片的底层代码ÿ…...