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();}
}
代码解析
  • 引入了BarChartCategoryAxisNumberAxis,这些是JavaFX Charts库中用于创建柱状图的类。
  • 创建了X轴(用于分类)和Y轴(用于数值),并设置了它们的标签。
  • 通过XYChart.SeriesXYChart.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)设置了onDragOveronDragDropped事件处理器,允许拖放并处理放下事件,将拖动的标签添加到目标区域,并调整位置。
  • 布局使用HBoxVBox来组织可拖动的标签和目标区域。

通过这个示例,你学习了如何在JavaFX应用中实现拖放功能,这增强了用户界面的交互性,让用户能直接参与和控制UI元素的布局或排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/28307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于Java

关于Java Java语言关于并发JVM调优工具写在最后 Java语言 Java语言作为当下主流开发语言&#xff0c;其面向对象的开发模式以及一次编译多次运行&#xff0c;跨平台运行以及自动的垃圾回收机制可以说是给开发者节省了很大的时间用于逻辑功能的开发&#xff0c;那么在开发过程中…

【Linux】pycharmgit相关操作

目录 1. git安装配置2. 相关内容3. pycharm连接远程仓库3.1 配置3.2 clone远程仓库3.3 本地仓库上传远程 4. 分支管理4.1 更新代码4.2 新建分支4.3 分支合并4.4 代码比对 5. 版本管理6. 命令行操作6.1 配置git6.2 基础操作6.3 分支操作 1. git安装配置 下载链接&#xff1a;官…

07--Zabbix监控告警

前言&#xff1a;和普米一样运维必会的技能&#xff0c;这里总结一下&#xff0c;适用范围非常广泛&#xff0c;有图形化界面&#xff0c;能帮助运维极快确定问题所在&#xff0c;这里记录下概念和基础操作。 1、zabbix简介 Zabbix是一个基于 Web 界面的企业级开源解决方案&a…

【C++】C++入门的杂碎知识点

思维导图大纲&#xff1a; namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域&#xff0c;它可以将内部的成员隔绝起来。举个例子&#xff0c;我们都知道有全局变量和局部变量&#xff0c;全局变量存在于全局域…

路由组件和非路由组件区别:

1、总结 路由组件和非路由组件区别&#xff1a; 非路由组件放在components中&#xff0c;路由组件放在pages或views中非路由组件通过标签使用&#xff0c;路由组件通过路由使用在main.js注册玩路由&#xff0c;所有的路由和非路由组件身上都会拥有$router $route属性$router&a…

SQLAlchemy:filter()和filter_by()的微妙差异

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Python编程中&#xff0c;SQLAlchemy是一个强大的ORM&#xff08;对象关系映射&#xff09;工具&#xff0c;它允许使用Python代码来操作数据库。然而&#xff0c;对于新手来说&#xff0c;SQLAlchemy中的一些函数…

Web前端开发PPT:深入探索与实战应用

Web前端开发PPT&#xff1a;深入探索与实战应用 在数字化时代&#xff0c;Web前端开发已成为构建丰富、交互性强的网页应用的关键环节。本次分享旨在通过PPT的形式&#xff0c;带领大家深入探索Web前端开发的精髓&#xff0c;并分享一些实战应用的经验。接下来&#xff0c;我们…

mybatis-plus使用拦截器实现sql完整打印

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在使用mybatis-plus&#xff08;mybatis&#xff09;的时候&#xff0c;往往需要…

【C语言】多进程创建和回收

多进程创建和回收 一、多进程创建和回收1. fork()2. wait()3. waitpid() 最后 一、多进程创建和回收 孤儿进程&#xff1a;父进程先退出了&#xff0c;子进程没有退出&#xff0c;成为孤儿进程&#xff0c;父进程变成1号进程。僵尸进程&#xff1a;父进程没有退出&#xff0c;…

英伟达开源最强通用模型Nemotron-4 340B:开启AI合成数据新纪元

【震撼发布】 英伟达最新力作——Nemotron-4 340B,一个拥有3400亿参数的超级通用模型,震撼登场!这不仅是技术的一大飞跃,更是AI领域的一次革命性突破! 【性能卓越】 Nemotron-4 340B以其卓越的性能超越了Llama-3,专为合成数据而生。它将为医疗健康、金融、制造、零售等行…

Studio One 6.6.2 for Mac怎么激活,有Studio One 6激活码吗?

如果您是一名音乐制作人&#xff0c;您是否曾经为了寻找一个合适的音频工作站而苦恼过&#xff1f;Studio One 6 for Mac是一款非常适合您的MacBook的音频工作站。它可以帮助您轻松地录制、编辑、混音和发布您的音乐作品。 Studio One 6.6.2 for Mac具有直观的界面和强大的功能…

C++初学者指南第一步---1. C++开发环境设置

C初学者指南第一步—1. C开发环境设置 目录 C初学者指南第一步---1. C开发环境设置1.1 工具1.1.1 代码编辑器和IDE1.1.2 Windows1.1.3 命令行界面 1.2 编译器1.2.1 gcc/g (支持Linux/Windows/MacOSX)1.2.2 clang/clang (支持Linux/Windows/MacOS)1.2.3 Microsoft Visual Studio…

《面向对象程序设计》第3章 类与对象(判断、选择、填空)-练习

1-1 常量对象可以使用常量成员函数。 T F | 参考答案 答案 T 2分 1-2 在定义常量成员函数和声明常量成员函数时都应该使用const关键字。 T F | 参考答案 答案 T 2分 1-3 对象间赋值将调用拷贝构造函数。 T F | 参考答案 答案 F 2分 1-4 对象数组生命期…

奇思妙想-可以通过图片闻见味道的设计

奇思妙想-可以通过图片闻见味道的设计 偷闲半日享清闲&#xff0c;炭火烧烤乐无边。肉串飘香引客至&#xff0c;笑语欢声绕云间。人生难得几回醉&#xff0c;且把烦恼抛九天。今宵共饮开怀酒&#xff0c;改日再战新篇章。周四的傍晚&#xff0c;难得的闲暇时光让我与几位挚友相…

数据仓库和数据库的区别

数据仓库和数据库在许多方面存在显著的区别&#xff0c;主要体现在数据的用途、架构、设计原则和性能优化上。以下是两者之间的详细区别&#xff1a; 1. 目的和用途 数据库&#xff08;Database&#xff09;&#xff1a; 主要用途&#xff1a;用于日常业务操作和事务处理。数据…

PAT B1026. 程序运行时间

题目描述 要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock(&#xff09;函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单位是clock tick,即“时钟打点”。同时还有一个常数CLK_TCK——给出了机器时钟每秒所走的时钟打点数…

继电器的保护二极管如何选择

继电器在实际应用中&#xff0c;通常都会使用三极管或MOS管控制&#xff0c;其最基本的应用电路如图&#xff1a; 那为什么要在继电器线圈上并联一个二极管呢&#xff1f;我们可以看看没有并联二极管时电路会出现什么情况&#xff0c;我们使用下图所示的电路参数仿真一下&#…

食家巷助力“甘肃乡村振兴,百强主播·打call 甘味”活动

2024年&#xff0c;甘肃省“商务乡村振兴”促消费暨“百强主播打call 甘味”活动在天水市龙城广场盛大启动。 活动现场&#xff0c;来自甘肃省 14 个市州的农特产品展台琳琅满目&#xff0c;让人目不暇接。此次活动中&#xff0c;各企业带来了多款深受消费者喜爱的产品&a…

【AI实践】Dify调用本地和在线模型服务

背景 Ollama可以本地部署模型&#xff0c;如何集成私有数据、如何外部应用程序对接&#xff0c;因此需要有一个应用开发框架 Dify功能介绍 欢迎使用 Dify | 中文 | Dify 下文将把dify部署在PC上&#xff0c;windows环境&#xff1b; 安装部署 安装dify及docker jacobJacobs…

【图解IO与Netty系列】Netty源码解析——服务端启动

Netty源码解析——服务端启动 Netty案例复习Netty原理复习Netty服务端启动源码解析bind(int)initAndRegister()channelFactory.newChannel()init(channel)config().group().register(channel)startThread()run()register0(ChannelPromise promise)doBind0(...) 今天我们一起来学…