JavaFX应用
JavaFX案例:集成进度条与后台任务
在这个示例中,我们将向JavaFX应用中集成一个进度条,用来展示一个模拟的后台任务的完成进度。这将涉及JavaFX的并发特性,特别是Task
类和如何在UI线程安全地更新UI组件。
假设我们想要实现一个简单的场景:用户点击一个按钮开始一个耗时的任务,期间进度条会根据任务完成情况实时更新,任务完成后显示完成信息。
修改后的主类代码
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;public class JavaFXProgressBarDemo extends Application {public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) {// UI元素Button startButton = new Button("开始任务");ProgressBar progressBar = new ProgressBar(0);Label statusLabel = new Label("等待任务开始...");// 设置任务Task<Void> task = createSimulationTask();// 绑定进度条到任务progressBar.progressProperty().bind(task.progressProperty());// 任务状态监听task.setOnSucceeded(event -> {statusLabel.setText("任务完成!");});task.setOnFailed(event -> {statusLabel.setText("任务失败!");});// 按钮点击事件处理startButton.setOnAction(event -> {progressBar.setProgress(ProgressIndicator.INDETERMINATE_PROGRESS);Thread thread = new Thread(task);thread.setDaemon(true);thread.start();});// 布局VBox vbox = new VBox(10);vbox.setAlignment(Pos.CENTER);vbox.getChildren().addAll(startButton, progressBar, statusLabel);// 场景Scene scene = new Scene(vbox, 480, 200);// 舞台primaryStage.setTitle("JavaFX 进度条示例");primaryStage.setScene(scene);primaryStage.show();}private Task<Void> createSimulationTask() {return new Task<Void>() {@Overrideprotected Void call() throws Exception {for (int i = 0; i <= 100; i++) {updateProgress(i, 100);Thread.sleep(50); // 模拟耗时操作,实际应用中应避免使用sleep}return null;}};}
}
代码解析
- 引入了一个
ProgressBar
和一个Button
,以及一个用于显示任务状态的Label
。 - 定义了一个
createSimulationTask
方法,返回一个Task<Void>
实例。这个任务在后台线程中执行,模拟一个逐步完成的过程,通过调用updateProgress
方法更新任务进度。 - 将进度条的进度属性与任务的进度属性绑定,确保UI可以反映任务的实际完成情况。
- 在按钮的点击事件处理器中,启动一个新线程来执行任务,并将进度条设置为不确定模式(
INDETERMINATE_PROGRESS
),直到任务开始报告具体进度。 - 添加了对任务成功或失败的监听,以便在任务结束后更新状态信息。
通过这个示例,你学习了如何在JavaFX应用中使用进度条展示后台任务的进度,以及如何通过Task
类安全地处理并发问题,保持UI的响应性和用户友好性。
JavaFX案例:实现图表展示(使用JavaFX Charts)
在前面的示例中,我们已经探索了JavaFX的基本UI组件、数据绑定、列表选择以及后台任务处理。现在,我们将进一步拓展,通过集成JavaFX Charts来创建一个动态的数据可视化界面。假设我们要展示一个简单的柱状图(Bar Chart),根据用户输入的数据动态更新图表。
准备工作
请注意,JavaFX Charts并非JavaFX核心库的一部分,需要单独引入相关依赖。如果你使用Maven或Gradle构建项目,需添加对应的依赖。
修改后的主类代码
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;public class JavaFXChartsDemo extends Application {public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) {// 创建X轴(分类轴)CategoryAxis xAxis = new CategoryAxis();xAxis.setLabel("类别");// 创建Y轴(数值轴)NumberAxis yAxis = new NumberAxis();yAxis.setLabel("数量");// 创建柱状图BarChart<String, Number> barChart = new BarChart<>(xAxis, yAxis);// 设置图表标题barChart.setTitle("数据分布");// 数据准备ObservableList<XYChart.Series<String, Number>> data = FXCollections.observableArrayList(new XYChart.Series<>("类别A", FXCollections.observableArrayList(new XYChart.Data<>("项目1", 20),new XYChart.Data<>("项目2", 30),new XYChart.Data<>("项目3", 15))),new XYChart.Series<>("类别B", FXCollections.observableArrayList(new XYChart.Data<>("项目1", 25),new XYChart.Data<>("项目2", 35),new XYChart.Data<>("项目3", 9))));// 将数据添加到图表barChart.getData().addAll(data);// 使用BorderPane作为根容器,并将图表置于其中BorderPane root = new BorderPane();root.setCenter(barChart);// 创建场景Scene scene = new Scene(root, 800, 600);// 设置舞台primaryStage.setTitle("JavaFX 图表示例");primaryStage.setScene(scene);primaryStage.show();}
}
代码解析
- 引入了
BarChart
、CategoryAxis
和NumberAxis
,这些是JavaFX Charts库中用于创建柱状图的类。 - 创建了X轴(用于分类)和Y轴(用于数值),并设置了它们的标签。
- 通过
XYChart.Series
和XYChart.Data
构建了两组数据,分别代表不同类别的数据分布。 - 将数据集添加到
BarChart
中,并设置了图表的标题。 - 使用
BorderPane
作为根布局容器,将柱状图放置于中心位置。 - 最后,像之前一样创建场景并显示舞台。
通过这个示例,你学习了如何在JavaFX应用中集成图表,为用户提供直观的数据可视化功能。尽管这里展示了静态数据的图表展示,但同样的原理可以应用于动态数据更新,以响应用户输入或其他实时数据源。
JavaFX案例:实现拖放功能(Drag and Drop)
在本示例中,我们将为JavaFX应用添加拖放(Drag and Drop)功能,让用户能够直接通过鼠标操作来移动或重新排序UI元素。我们将创建一个简单的界面,其中包含几个可拖动的标签,用户可以将这些标签拖放到一个目标区域。
修改后的主类代码
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;public class JavaFXDragAndDropDemo extends Application {public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage primaryStage) {// 创建可拖动的标签集合Label label1 = createDraggableLabel("标签1");Label label2 = createDraggableLabel("标签2");Label label3 = createDraggableLabel("标签3");// 创建目标区域Pane targetArea = new Pane();targetArea.setStyle("-fx-background-color: #DDDDDD; -fx-border-color: black;");targetArea.setPrefSize(200, 200);// 设置目标区域为可接受拖放targetArea.setOnDragOver(event -> {Dragboard db = event.getDragboard();if (db.hasString()) {event.acceptTransferModes(TransferMode.COPY_OR_MOVE);}event.consume();});targetArea.setOnDragDropped(event -> {Dragboard db = event.getDragboard();boolean success = false;if (db.hasString()) {Label label = (Label) event.getGestureSource();label.relocate(event.getX() - (label.getWidth() / 2), event.getY() - (label.getHeight() / 2));targetArea.getChildren().add(label);success = true;}event.setDropCompleted(success);event.consume();});// 布局VBox vbox = new VBox(10, label1, label2, label3);HBox hbox = new HBox(10, vbox, targetArea);// 场景Scene scene = new Scene(hbox, 600, 400);// 舞台primaryStage.setTitle("JavaFX 拖放示例");primaryStage.setScene(scene);primaryStage.show();}private Label createDraggableLabel(String text) {Label label = new Label(text);label.setOnDragDetected(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent event) {Dragboard db = label.startDragAndDrop(TransferMode.ANY);ClipboardContent content = new ClipboardContent();content.putString(label.getText());db.setContent(content);event.consume();}});return label;}
}
代码解析
- 通过
createDraggableLabel
方法创建可拖动的Label
,为其添加onDragDetected
事件处理器,用于启动拖放操作。 - 当拖动开始时,我们使用
Dragboard
存储要传输的数据(这里是标签的文本),并设置允许的传输模式。 - 目标区域(
Pane
)设置了onDragOver
和onDragDropped
事件处理器,允许拖放并处理放下事件,将拖动的标签添加到目标区域,并调整位置。 - 布局使用
HBox
和VBox
来组织可拖动的标签和目标区域。
通过这个示例,你学习了如何在JavaFX应用中实现拖放功能,这增强了用户界面的交互性,让用户能直接参与和控制UI元素的布局或排序。
相关文章:
JavaFX应用
JavaFX案例:集成进度条与后台任务 在这个示例中,我们将向JavaFX应用中集成一个进度条,用来展示一个模拟的后台任务的完成进度。这将涉及JavaFX的并发特性,特别是Task类和如何在UI线程安全地更新UI组件。 假设我们想要实现一个简…...

axios打通fastapi和vue,实现前后端分类项目开发
axios axios是一个前后端交互的工具,负责在前端代码,调用后端接口,将后端的数据请求到本地以后进行解析,然后传递给前端进行处理。 比如,我们用fastapi写了一个接口,这个接口返回了一条信息: …...

【最新鸿蒙应用开发】——ArkWeb1——arkts加载h5页面
1. Web组件概述 Web组件用于在应用程序中显示Web页面内容,为开发者提供页面加载、页面交互、页面调试等能力。 页面加载:Web组件提供基础的前端页面加载的能力,包括:加载网络页面、本地页面、html格式文本数据。 页面交互&#…...
【设计模式】结构型设计模式之 享元模式
文章目录 介绍关键概念 应用举例象棋游戏共享棋子对象文本编辑器中文字格式设计成享元模式 享元模式在 Java 中的应用享元模式在包装类缓存中的应用享元模式在 String 中的应用 对比享元模式和单例模式的区别享元模式与缓存的区别 总结优点缺点 介绍 享元模式,”享…...
嵌入式操作系统_5.存储管理
1.存储管理 存储管理是嵌入式操作系统的基本功能之一。其管理的对象是主存,也称内存。它的主要功能包括分配和回收主存空间、提高主存利用率、扩充主存、对主存信息实现有效保护。存储器管理的目的就是提供一个有价值的内存抽象,其目标包括:…...
HTML DOM 事件
HTML DOM 事件 HTML DOM(文档对象模型)事件是当网页中的某些操作发生时,浏览器会自动触发或通过脚本代码手动触发的动作。这些事件可以是对用户操作的响应,如点击按钮,也可以是浏览器自身的动作,如页面加载完成。理解和掌握DOM事件对于前端开发至关重要,因为它们是实现…...

有没有硅基生命?AGI在哪里?
摘要 随着科技的飞速发展,人工智能(AI)和生命科学的探索逐渐成为人们关注的焦点。其中,关于硅基生命的可能性与AGI(Artificial General Intelligence,即人工通用智能)的实现,更是引…...

HAL库开发--串口
知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 开发流程 串口功能配置 串口功能开启 串口中断配置 串口参数配置 查询配置结果 发送功能测试 中断接收功能测试 printf配置 DMA收发 配置 DMA发送 DMA接收(方式1) DMA接收(方式2) 总结 前言…...
Web前端设计毕业论文:深度探索与未来展望
Web前端设计毕业论文:深度探索与未来展望 在数字化时代,Web前端设计作为互联网应用的重要组成部分,其重要性和复杂性日益凸显。本论文旨在深度探索Web前端设计的关键要素、发展趋势以及面临的挑战,为未来的研究和实践提供有价值的…...
JAVA 字节运算 取低5位 获取低位第一位
1、JAVA 取低5位 什么是取低5位 在计算机中,每个数字都是以二进制形式存储的。一个二进制数字可以由多个位组成,每一位都可以是 0 或者 1。取低5位即表示只取二进制数字的最后5位(从右向左数)。 取低5位的方法 在 JAVA 中&#…...

全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0
1.stablediffusion的概述: Stable Diffusion(简称SD)近期的动态确实不多,但最新的发展无疑令人瞩目。StableCascade、Playground V2.5和Stableforge虽然带来了一些更新,但它们在SD3面前似乎略显黯然。就在昨晚&#x…...

智慧监狱技术解决方案
1. **建设背景**:介绍了智慧监狱建设的战略部署,包括司法部提出的“数字法治、智慧司法”信息化体系建设,以及智慧监狱建设的总体目标、重点任务和实施步骤。 2. **建设需求**:分析了当前监狱系统存在的问题,如子系统…...
QT——事件
一、什么是事件 在QT中,事件(Event)是指由特定对象发生的动作或状态变化,通常用于响应用户的操作。事件可以是鼠标点击、键盘输入、窗口移动等用户操作,也可以是系统发出的信号,比如定时器超时、网络数据到达等。在QT中,可以通过连接信号与槽(Signals and Slots)的方…...

【SpringBoot】Spring Boot 中高级特性详解
文章目录 1. 异步处理1.1 什么是异步处理?1.2 实现异步处理1.2.1 启用异步支持1.2.2 使用 Async 注解1.2.3 调用异步方法 2. 安全管理2.1 Spring Security 集成2.2 基础安全配置2.2.1 添加依赖2.2.2 默认配置2.2.3 自定义用户认证 3. 监控和调试3.1 Spring Boot Act…...
MQTT TCP HTTP 协议对比
目录 1. 类型与用途 2. 通信模式与特性 3. 优缺点 4. 使用场景 MQTT、TCP和HTTP在类型、用途、通信模式、特性以及使用场景等方面存在显著的区别,以下是详细的阐述: 1. 类型与用途 MQTT:MQTT是一种消息传输协议,主要适用于物…...

C++面向对象程序设计 - 函数库
C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库,C从C语言继承了些函数功能。如果要用函数库中的函数,就必须在程序文件中包含文件中有关的头文件,在不同的头文件中,包含了不…...
computeIfAbsent是Java 8引入的Map接口中的一个方法
computeIfAbsent是Java 8引入的Map接口中的一个方法,它提供了一种更高效且线程安全的方式来 conditionally compute or retrieve a value for a given key in a map. 当你想要为一个键计算一个值(如果该键尚不存在对应的映射关系),…...
HTML实现进度条/加载框模版
HTML加载 一、环形加载 1二、环形加载 2三、波形加载四、百分比环形五、进度条 一、环形加载 1 <div class"loader"></div>.loader {border: 16px solid #f3f3f3;border-radius: 50%;border-top: 16px solid #3498db;width: 120px;height: 120px;-webki…...
Python 3 列表
Python 3 列表 Python 3 中的列表是一种基本的数据结构,用于存储一系列有序的元素。列表是可变的,这意味着可以修改其内容。在 Python 中,列表是非常灵活和强大的,广泛用于各种编程任务。 创建列表 创建列表非常简单,只需将元素用逗号分隔,并包围在方括号 [] 内。例如…...

Type-C接口显示器:C口高效连接与无限可能 LDR
Type-C显示器C接口的未来:高效连接与无限可能 随着科技的飞速发展,我们的日常生活和工作中对于高效、便捷的连接方式的需求日益增加。在这样的背景下,Type-C接口显示器凭借其卓越的性能和广泛的兼容性,正逐渐崭露头角,…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...