`

玩酷: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  
相当支持你

相关推荐

    中文分词器

    1.基于 trie 树结构实现高效词图扫描 2.生成所有切词可能的有向无环图 DAG 3.采用动态规划算法计算最佳切词组合 4.基于 HMM 模型,采用 Viterbi (维特比)算法实现未登录词识别

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

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

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

    知网语义相似度计算JAVA源码,方便各位研究改进

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

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

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

    《边学边玩酷JS》 链接: 作者: Willin Wang 作品集合 《不可替代的团队领袖培养计划》: 《边学边玩酷js》: 《Codewars 解题集》: License MIT 通过支付宝捐赠:

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

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

    云盘管理系统HDFS.rar

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

    VC SDK 实现半透明菜单

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

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

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

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

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

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

    想简单的修改桌面的位置吗 你已经厌倦了对桌面一堆堆文件的重复排列了吗 试试这个吧 你会有不一样的感觉的

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

    ASP源码,压缩包解压密码:www.cqlsoft.com

    时尚qq非主流輸入法

    非主流输入法,时尚青年玩酷一族必备 实现非主流字体-繁体字-简体字之间的轻易切换

    navinpai.github.com:剧本

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

    三维视觉 EsCms.rar

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

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

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

    三层结构工厂模式 一定好用,下载

    大王地天天地 一本一无奇不有二楼三二要玩酷地

    一特音乐网站管理系统

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

    十种Lightbox特效示例

    自己收藏的一些Lightbox特效示例,希望这个能给玩酷的朋友带来帮助。

    Fun Free Arcade Games-crx插件

    玩酷的数学游戏。 适合各个年龄段的难题,脑筋急转弯,逻辑等等。 免费玩酷有趣的数学游戏。 可以直接在此Chrome扩展程序中享受游戏,因此您可以全屏播放它们,并免费享受每一分钟有趣的街机游戏! 有六种游戏可以玩...

Global site tag (gtag.js) - Google Analytics