JavaFX之Drag And Drop拖放操作

2023-11-12

声明: 本博客文章原创类别的均为个人原创,版权所有。转载请注明出处: http://blog.csdn.net/ml3947(看到有网站直接copy不加链接,当然我的个人博客文章目前都是从我的CSDN博客转移上去的)。


大家好,新的JavaFX的教程又到来了。

是不是很多程序都有拖动文件到程序里的功能?有没有感觉拖放操作很cool?我们的JavaFX当然也支持这样的操作。

在JavaFX中,我们不仅可以从一个控件拖动内容到另外一个控件,还可以从系统拖动文件到JavaFX的控件,甚至还可以从一个JavaFX程序中拖动内容到另外一个JavaFX程序中。

看起来不错吧?我们下面将会讲解在JavaFX中的拖放操作。


首先,打个小广告。本人的个人博客地址: http://www.wjfxgame.com

目前本人的JavaFX示例都可以在个人博客上面在线运行(除了部分)。虽然因为笔记本数据丢失,数量不多。不过本人也一直在编写中(由于在开发JavaFX游戏引擎,可能速度不会很快)。


本篇教程的示例地址: 点击

从Drag Me的标签拖动到 Drop On Me标签上。

从本地,拖动一个图片 到 drag a image to this的标签下面,可以显示你拖动的图片。

从本地,拖动一个文本文件 到 drag a txt to this的标签下面,可以显示你拖动的文本的内容(因为编码问题可能乱码,可以使用UTF-8等编码的文本)。


截图:

在JavaFX中关于拖放操作,可以设置这么几种事件监听器。

setOnDragDetected(new EventHandler<MouseEvent>());

当你从一个Node上进行拖动的时候,会检测到拖动操作,将会执行这个EventHandler。


setOnDragEntered(new EventHandler<DragEvent>());

当你拖动到目标控件的时候,会执行这个事件回调。


setOnDragExited(new EventHandler<DragEvent>());

当你拖动移出目标控件的时候,执行这个操作。


setOnDragOver(new EventHandler<DragEvent>());

当你拖动到目标上方的时候,会不停的执行。

setOnDragDropped(new EventHandler<DragEvent>());

当你拖动到目标并松开鼠标的时候,执行这个DragDropped事件。


setOnDragDone(new EventHandler<DragEvent>());

当你拖动并松手的时候,执行Drag完成操作。


这里要注意的是,首先执行拖动,拖动到目标控件的时候,会首先执行DragEnter,这个只执行一遍。然后当你停留在目标控件上方的时候,会不停的指定DragOver操作。


下面我们来看看示例中的代码:

m_drag.setOnDragDetected(new EventHandler<MouseEvent>() {

			@Override
			public void handle(MouseEvent event) {
				Dragboard dragboard = m_drag.startDragAndDrop(TransferMode.ANY);
				ClipboardContent content = new ClipboardContent();
				content.putString(m_drag.getText());
				dragboard.setContent(content);
			}
		});

		m_drop.setOnDragEntered(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				m_drop.setTextFill(Color.RED);
			}
		});

		m_drop.setOnDragExited(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				m_drop.setTextFill(Color.BLACK);
			}
		});

		m_drop.setOnDragOver(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				if (event.getGestureSource() != m_drop && event.getDragboard().hasString()) {
					event.acceptTransferModes(TransferMode.COPY_OR_MOVE);
				}
			}
		});

		m_drop.setOnDragDropped(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				Dragboard dragboard = event.getDragboard();
				m_drop.setText(dragboard.getString());
			}
		});

		m_drag.setOnDragDone(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				m_drag.setText("");
			}
		});

其中m_drag是Drag Me标签Label。m_drop是Drop on Me标签Label。

我们在检测到拖动m_drag标签的时候,使用了一个Dragboard,俗称"拖板"(...), 当然不能这样称呼,但是很明显,它就类似于ClipBoard剪切板。我们将拖动要传送的数据使用ClipboardContent设置到Dragboard上。

其他的就是比较简单的,当拖动到m_drop上面的时候,改变m_drop的颜色。

在DragOver的时候 通过event.acceptTransferModes(TransferMode.ANY);来设置接收数据的类型。

在Drag松开的时候,通过获取Dragboard的数据,来设置到标签上。


上面是JavaFX中 控件与控件之间拖动数据的示例。当然很多处理不得当,只是为了演示所有的拖动方法,所以才将每个事件都使用到。


下面来看看拖动文件的:

m_imageView.setOnDragOver(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				if (event.getGestureSource() != m_imageView) {
					event.acceptTransferModes(TransferMode.ANY);
				}				
			}
		});
		
		m_imageView.setOnDragDropped(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				Dragboard dragboard = event.getDragboard();
				List<File> files = dragboard.getFiles();
				if(files.size() > 0){
					try {
						m_imageView.setImage(new Image(new FileInputStream(files.get(0))));
					} catch (FileNotFoundException e) {
						e.printStackTrace();
					}
				}
			}
		});

这里只有一个DragOver和DragDropped。

松手之后,同样通过 Dragboard获取拖动的文件列表,我们这里将拖动到的第一个文件当作数据流创建图片并设置到imageView中。

这里的操作比较简单,其实可以做更为复杂的判断。


文本也是相同的:

		m_textArea.setOnDragOver(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				if (event.getGestureSource() != m_imageView) {
					event.acceptTransferModes(TransferMode.ANY);
				}				
			}
		});
		
		m_textArea.setOnDragDropped(new EventHandler<DragEvent>() {

			@Override
			public void handle(DragEvent event) {
				Dragboard dragboard = event.getDragboard();
				List<File> files = dragboard.getFiles();
				if(files.size() > 0){
					m_textArea.setText(FileTools.readFile(files.get(0)));
				}
			}
		});

是不是很简单,当拖动操作在JavaFX程序中流行起来后,想一想我们可以从这个JavaFX程序拖动到另外一个JavaFX程序中,就会觉得很兴奋,或许会因此出现很多意想不到的应用(当然,前提是JavaFX能够被大家认可,广泛传播)。


考虑到大家copy粘贴源代码修改看效果也不方便,以后本人的示例工程全部打包上传到CSDN下载栏目中,并且无需积分。

本文章示例项目下载地址:http://download.csdn.net/detail/ml3947/5307918

转载请注明出处:http://blog.csdn.net/ml3947

-----------------------------------------------------------------------------------------

...上传资源后,得了很久才显示出来。要是CSDN下载栏目效率太低,就传到其他地方去。

------------------------------------------------------------------------------------------

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX之Drag And Drop拖放操作 的相关文章

  • 判断子序列

    给定字符串 s 和 t 判断 s 是否为 t 的子序列 leetcode链接 你可以认为 s 和 t 中仅包含英文小写字母 字符串 t 可能会很长 长度 500 000 而 s是个短字符串 长度 lt 100 字符串的一个子序列是原始字符串

随机推荐

  • 项目经理与技术经理的区别

    项目经理和技术经理有什么区别 区别有多大呢 这个问题此前我从没有认真的去思考过 直到被明确的问到的时候 才细思极恐 连两者的区别都没能有条理的讲出来 一 关于项目经理 在没有真正进入软件行业之前 对于系统集成方面的项目还是有些心得的 有种一
  • 编译Linux内核获取LLVM bitcode (LLVM IR)

    最近要获取linux内核的llvm bitcode 以便后续进行分析 例如获取callgraph等等 尝试了很多提取llvm bitcode的方法 用build bom wllvm 过程中也出现了很多错误 最后用wllvm终于成功了 记录下
  • Docker容器与虚拟化技术:Docker资源控制、数据管理

    目录 一 理论 1 资源控制 2 Docker数据管理 二 实验 1 Docker资源控制 2 Docker数据管理 三 问题 1 docker容器故障导致大量日志集满 造成磁盘空间满 2 当日志占满之后如何处理 四 总结 一 理论 1 资
  • 【模电】0014 运放自激振荡和消除(补偿)

    一般我们讨论的负反馈放大电路多关注其幅频特性 也就是它的增益 而对其相频特性关注的不多 这主要是因为 一个放大电路如果它工作状态是稳定的 其输入和输出相差一定的相位对分析它的特性并不影响 只是相当于信号延迟了一点时间 注意这里有个前提条件
  • 关于IP网段间互访的问题——路由是根本

    文章出处 http blog csdn net dog250 archive 2010 02 09 5303291 aspx 之所以IP网段间可以互相访问 完全靠的就是路由 因此路由是IP通信的根本 IP是机器可以进行通信的资格证书 而路由
  • 【满分】【华为OD机试真题2023 JAVA&JS】工作安排

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 工作安排 知识点循环数组贪心动态规划 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 小明每周上班都会拿到自己的工作清单 工作清单内包含n项工作 每项工作都有对应的
  • Vue Baidu Map使用

    百度地图官方提供的是常规
  • DS单链表--类实现

    用C 语言和类实现单链表 含头结点 属性包括 data数据域 next指针域 操作包括 插入 删除 查找 注意 单链表不是数组 所以位置从1开始对应首结点 头结点不放数据 输入 n 第1行先输入n表示有n个数据 接着输入n个数据 第2行输入
  • 螺旋队列(由里向外)

    假设有如下排列 21 22 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13 1的坐标是 0 0 3的坐标是 1 1 7的坐标是 1 1 分析 第1层之内有1个数 第2层之内有9个数 第3
  • Kafka Connect JNDI注入漏洞复现(CVE-2023-25194)

    漏洞原理 Apache Kafka Connect中存在JNDI注入漏洞 当攻击者可访问Kafka Connect Worker 且可以创建或修改连接器时 通过设置sasl jaas config属性为com sun security au
  • Qt界面刷新优化的一些心得

    背景 一个类似Windows任务管理器的性能界面 该界面有多个曲线图同时定时刷新 每个曲线图包括多条曲线更新 数据更新频率大概为一秒一次 程序中曲线图已封装为自定义的图表类 给出数据更新接口 初始方案 主程序设计方案上 采用数据收集和数据更
  • 《云计算与大数据技术应用》

    第一章 云计算概述 1 1什么是云计算 1 1 1云计算的定义 云计算是分布式计算的一种 指的是通过网络 云 将巨大的数据计算处理程序分解成无数个小程序 然后 通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户 云计算早期
  • javascript数组的直接量语言允许有可选的结尾的逗号

    var undefs 数组有2个元素 都是undefined 数组直接量的语法允许有可选的结尾的逗号 故 只有两个元素
  • OA会议管理系统之我的会议(会议排座&可拖拽座位&附源码)

    目录 一 前言 1 导读 二 我的会议功能实现 1 功能介绍 2 功能分析 3 功能实现 3 1 前期准备 3 2 dao层编写 3 3 jsp页面搭建 3 4 Web层编写 4 案例展示 一 前言 1 导读 OA会议管理系统之会议发布 内
  • RabbitMQ提供了6种消息模型介绍

    RabbitMQ提供了6种消息模型 但是第6种其实是RPC 并不是MQ 因此不予学习 那么也就剩下5种 但是其实3 4 5这三种都属于订阅模型 只不过进行路由的方式不同 一 基本消息模型 RabbitMQ是一个消息代理 它接受和转发消息 你
  • oracle删除重复数据保留第一条记录

    1 查找表中多余的重复记录 重复记录是根据单个字段 Id 来判断 select from 表 where Id in select Id from 表 group byId having count Id gt 1 2 删除表中多余的重复记
  • zoj 1201 Inversion

    题目意思 如果输入的是p类串 则输出i类串 如果输出的是i类 则输出p类串 p转i 寻找在p串中在j左边的比j大的数的个数 i串中的第j个数填为该数 i转p 从尾部开始 若第j个数的值为x 则说明在p串中j的左边有x个数大于j 通过从后到前
  • spring集成kafka,实现一个topic可以被多个group消费

    由于新公司是做物联网的 公司刚起步 没什么项目 就是在做一些基础的服务的搭建 现在微服务这么火 可想而知 Spring Boot Spring Cloud 是必须要会的技能 而做物联网 把各种智能设备的数据采集上来 也避免不了要用到消息系统
  • Linux 下qt creator 对c++ 和cuda混合编译生成.so 文件

    问题一 creator 上如何设置可以编译输出 so 文件 要做哪些工作呢 解决如下 1 TEMPLATE lib DEFINES TESTPCL LIBRARY 我的项目名 TARGET testPCL 2 在我要开放出去的接口类那里 做
  • JavaFX之Drag And Drop拖放操作

    声明 本博客文章原创类别的均为个人原创 版权所有 转载请注明出处 http blog csdn net ml3947 看到有网站直接copy不加链接 当然我的个人博客文章目前都是从我的CSDN博客转移上去的 大家好 新的JavaFX的教程又