`

玩酷:Java界面开发学习笔记[四] 拖拽效果的实现

阅读更多
一、介绍
为应用程序添加拖拽效果,或许更加能发挥用户操作主动性和灵活性了。记事本,for example,在选择点击open按钮打开文件与直接将文件拖拽到一个打开的记事本程序相比,或许大家会选择后者(这里只是拿记事本举例,就不必提为什么不双击文件之类云云了),一个是用户主动性有很大的改善,而不必按照程序设计人员提供的点击某按钮或某快捷键等来唤起操作相应了,同时从某种角度说,也提升了用户体验。另外,拖拽为GUI中的不同实体间显式传送数据提供了便捷的方式。所以在程序中恰当的应用拖拽效果,对改善软件友好性有一定帮助的。
这里,介绍一下java dnd拖拽的实现,欢迎大家拍砖。
关于java dnd 拖拽实现的原理介绍,请参考该博文Java dnd拖拽实现分析纪要,这里就不再讨论了。
简单来说,拖拽效果由一下主要几个过程组成:
·拖拽进入
·拖拽经过
·拖拽释放
·拖拽离开等
笔者学习习惯是先看效果,再深入了解其本质内容,所以在这里还是先演示如何为程序添加拖拽效果。

二、准备工作
新建一个java工程,设计一个窗口,窗口使用BordLayout布局,内含一个JTextArea(textArea),为后面拖拽文件到该窗口后显式文件内容用。效果如下图:

PS:为了后面操作简单性,我们将textArea的访问声明设置为public static。

三、编程实现拖拽效果
第一步:新建一个类实现DropTargetListener接口。如下:
public class DndTargetListener implements DropTargetListener {

	@Override
	public void dragEnter(DropTargetDragEvent arg0) {
	}

	@Override
	public void dragExit(DropTargetEvent arg0) {

	}

	@Override
	public void dragOver(DropTargetDragEvent arg0) {
	}

	@Override
	public void drop(DropTargetDropEvent arg0) {
	}

	@Override
	public void dropActionChanged(DropTargetDragEvent arg0) {
	}
}

观察代码,各方法的功能都可以从字面意思上理解。当然这里拖拽效果演示的是释放文件后读取文件内容,所以这里实现的是DropTargetListener接口,如果你还想对被拖拽对象进行处理或管理,则还可以实现DragSourceListener接口,还有其他一些接口提供不同的功能,如DragGestureListener等。
第二步:实现相应的方法。
我们当然不想什么文件都可以拖到该窗口内,如exe文件、com文件等,所以我们要过滤掉一些文件。这个需求我们可以在dragEnter方法中进行处理。在该方法里添加代码片段:
if (!arg0.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
				&& !arg0.isDataFlavorSupported(DataFlavor.stringFlavor)) {
			arg0.rejectDrag();
		}

这里提一下,DataFlavor.javaFileListFlavor是设定要将文件列表传入 Java(即基础平台)或从中传出。其他的还有像imageFlavor、stringFlavor、plainTextFlavor等。想了解更多的可以参考Java API。
这里我们对“拖拽离开”动作不做处理。“拖拽经过”动作和“拖拽进入”操作相同,也可不做处理。
第二步:处理拖拽释放动作,即实现drop方法。先粘代码,具体代码如下:
public void drop(DropTargetDropEvent arg0) {
		arg0.acceptDrop(DnDConstants.ACTION_REFERENCE);
		if (arg0.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
			try {
				Transferable tf = arg0.getTransferable();
				List<File> list = (List<File>) tf
						.getTransferData(DataFlavor.javaFileListFlavor);
				for (File f : list) {
					if (f.exists() && f.isFile()) {
						MainFrm.textArea.append(f.getAbsolutePath() + "\n");
						MainFrm.textArea.append("======================\n");
						br = new BufferedReader(new FileReader(f));
						while ((line = br.readLine()) != null)
							MainFrm.textArea.append(line + "\n");
						br.close();
					} else if (f.exists() && f.isDirectory()) {
						// 这里不对拖拽文件夹做操作
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

这里实现的功能是当同时拖拽多个文件到文本框时,则显示各文件绝对路径和内容。代码就不详细分析了,主要说的是,前面设定的DataFlavor为javaFileListFlavor,这里获得的是个文件列表(list),所以我们这里使用一个List来接收。
第三步:为textArea添加对拖拽效果的支持。代码实现如下:
dnd = new DndTargetListener();
		textArea.setDropTarget(new DropTarget(this, DnDConstants.ACTION_REFERENCE,
				dnd, true));


这样一个简单的拖拽效果演示程序就完成了,最后我们来跑起来看看吧。


好了,关于拖拽效果的实现就介绍到这里。能力有限,如果分析有误,欢迎大家批评指正。
分享到:
评论
2 楼 shansun123 2009-03-18  
axhack 写道
相当支持你

谢谢你的支持~
1 楼 axhack 2009-03-18  
相当支持你

相关推荐

    中文分词器

    开发者可以编写Java程序,利用数据结构和算法知识来构建Trie树、生成DAG、实现动态规划算法以及HMM和Viterbi算法。"SemanticAnalysisDemo"这个文件名可能是一个演示性的分词程序,它可能包含了以上所述的全部功能,...

    玩酷之家系统盘备份工具CoolBackup 1.0.rar

    玩酷之家系统盘备份工具可以在WINPE环境下使用,也可以在WIN7系统中使用,能够将系统盘(默认是C盘)保存为WIM格式镜像文件,支持备份完成后自动关机。不同于.GHO格式文件,它备份的是基于WIM格式的,支持gpt格式的...

    知网语义相似度计算JAVA源码

    在这个JAVA源码中,开发者提供了一个工具,用于实现这一功能,便于其他研究者和开发者进行研究和改进。下面我们将深入探讨相关知识点。 首先,我们要了解什么是语义相似度。在自然语言处理中,语义相似度是指两个...

    基于php的玩具网站的设计与实现毕业论文.docx

    论文的设计主要包括七个部分:系统开发意义、系统开发技术、系统可行性分析、系统总体设计、系统页面详细介绍、系统功能实现和完成系统测试。 论文的主要知识点和技能包括掌握 PHP 技术、掌握 MYSQL 数据库和掌握...

    桌面装扮也玩酷 简易的桌面文件排列工具

    标题中的“桌面装扮也玩酷 简易的桌面文件排列工具”暗示我们这里讨论的是一款可以帮助用户轻松整理和美化桌面的应用程序。这类工具通常具备自动化文件排序、创建快捷方式、自定义桌面布局等功能,使得桌面保持整洁...

    玩酷之家WIM、ESD系统安装工具CoolInstall 1.0.zip

     CoolInstall是玩酷之家开发的一款用于安装WIM、ESD映像文件的系统安装工具,不能安装GHO镜像系统。支持最新的Windows系统安装,支持多种安装方式,如UEFI、双系统、多系统,启动菜单自动修复。 可以在WINPE系统下...

    就爱设计 v6.00 玩酷时代(个性版) -ASP源码.zip

    对于想要进行网站个性化设计的用户来说,通过研究和修改这个源码,可以学习到如何创建动态表单、处理用户输入、实现数据的增删改查以及定制化的页面布局等技能。ASP源码的可读性和灵活性,使得开发者能够根据自己的...

    基于语音的人机交互界面的研究与实现

    智能语音交互系统用来处理用户的请求,并返回最匹配的结果。它需要抛弃繁琐的语法结构,甚至思维模式也可以混乱,结合上下文结构去理解,还会从人类语言史的角度出发,利用人工智能系统去分析,并在绝大多数情况下...

    learn.js.cool:《边学边玩酷JS》

    1. **JavaScript基础**:JavaScript是一种广泛用于Web开发的脚本语言,它主要负责网页的动态效果和交互性。书中会详细介绍变量、数据类型(包括基本类型和引用类型)、操作符、控制结构(如条件语句和循环)、函数等...

    云盘管理系统HDFS.rar

    教师可以上传资源来建设自己的课程 ,学生通过App可以观看视频 、下载学习资源、提问、评论等...后端技术:Java、Servlet、JSP 前端技术:CSS、HTML、JQUERY、AJAX 数据库:MYSQL 开发工具:eclipse、Android studio、P

    VC SDK 实现半透明菜单

    花了2天看了codeproject上的一个牛人代码,滤出了的这个东西,因为曾经看到CSDN上有人说实现很复杂,几乎完全自绘,令人望而却步,玩酷UI的兄弟们别紧张,其实我的代码实现非常简单了,只有不到20行的代码.程序非常简单...

    vue-sticky:Vue Sticky是一个简单的便签应用程序,可以拖动

    Vue Sticky是一个简单的便签应用程序,可以拖动。 Vue粘性是使用Vue3,TypeScript,Tailwind CSS,Vue合成API开发的。 特征! 添加便签 删除便签 拖放笔记 玩酷字体 科技类 Vue3 打字稿 尾风CSS Vue Composition ...

    玩酷之家系统引导修复工具BootRepair.rar

    软件介绍:  如果你的系统因各种原因出现开机不能引导,引导文件损坏不能进系统,不需要重新系统,先使用本工具进行修复,将系统引导修复工具BootRepair放到带有PE启动的U盘中,使用U盘来引导系统,运行Boot...

    用VB编写的局域网多人聊天系统

    【VB局域网多人聊天系统】是一个基于Visual Basic(VB)开发的,专为局域网内的用户设计的即时通讯工具。这个系统允许在同一网络环境下多用户之间进行实时的文本交流,提供了一个简单易用、高效便捷的沟通平台。下面...

    navinpai.github.com:剧本

    自述文件 只是创建一个新的游乐场,以便在网络上玩酷的东西:) 即将在这里测试几个JQuery插件和Javascript框架 Navin“ M @ dMAx” Pai 3/6/2013

    锐捷网络-2015校园招聘笔试题-嵌入式

    锐捷网络,作为中国知名的网络设备制造商,2015年在校园招聘中...通过锐捷网络的校园招聘笔试题,求职者不仅可以检验自己的嵌入式开发水平,还可以借此机会进一步学习和提升相关技能,为未来的职业生涯打下坚实的基础。

    三维视觉 EsCms.rar

    个功能强大,版面个性玩酷的网站系统 集合了文章、下载、新闻、作品、图片、公告、页面管理、常用链接等等为一体 集成所见即所得编辑器,可自由添加二级分类,灵活的一级导航管理 系统非常适合于个人网站使用。 ...

    火星文编写器(最酷是软件)

    拥有火星文编写器,引领时代新潮流。玩酷人生!

    巨量引擎-抖音上的80后、90后、00后 之 00后篇-2019.8-15页.pdf

    1. **玩酷范**:这一类00后用户追求独特、新奇、有趣的内容,尤其是那些看起来很“酷”的事物。数据显示,在搞笑短剧、明星相关视频、多人现代舞等领域,00后的点赞量增长显著。例如,搞笑短剧的点赞量增加了307%。 ...

    一特音乐网站管理系统

    歌词与歌曲同步显示,玩酷您网站的魅力! 后台高效采集,整站生成HTML静态文件,适合从个人到商业各方面应用的要求,为您提供一个安全、稳定、高效、易用而快捷的音乐系统。 Beta 2.0更新说明 -------------------...

Global site tag (gtag.js) - Google Analytics