Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结

1. 实现一个D&D操作一般包括三个步骤:
1

2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的) 2

3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的) 2

4. 代码 3

5. 参考 5

1. 实现一个D&D操作一般包括三个步骤:

首先实现一个拖拽源,这个拖拽源和相应的组件是关联起来的

 第二步实现一个拖拽目标,这个目标用来实现拖拽物的接收

 第三步实现一个数据传输对象,该对象封装拖动的数据

  _____________________                                      _____________________

 |                     |                                     |                    |   

 | DragSource Component|                                     |DropTarget Component|

 |_____________________|                                     |____________________|

                   |                                              |

                   |____________Transferable Data_________________|

                   

 Transferable 接口实现出的对象能够保证  DropTarget Component读懂拖拽过来的对象中包含的信息

 如果是在同一个虚拟机中实现拖拽的话,DragSource Component会传递一个引用给DropTarget Component

 但是如果在不同的JVM中或者是在JVM和本地系统之间传递数据的话我们就必须实现一个Transferable对象来传递数据

 Transferable中封装的内容存放到DataFlavors,用户可以通过访问DataFlavors来获取数据

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

2. .net黑头的拖曳机制.必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的)

思路: 通过DragEnter事件获得被拖入窗口的“信息”(可以是若干文件,一些文字等等),

在DragDrop事件中对“信息”进行解析。





窗体的AllowDrop属性必须设置成true;





且必须有DragEnter事件(单独写DragDrop事件是不会具有拖拽功能的)

private void Form1_DragEnter(object sender, DragEventArgs e)

 {

              if (e.Data.GetDataPresent(DataFormats.FileDrop))

                  e.Effect = DragDropEffects.Link; //重要代码:表明是链接类型的数据,比如文件路径

               else e.Effect = DragDropEffects.None;

    }





         private void Form1_DragDrop(object sender, DragEventArgs e)

         {

               string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();

             MessageBox.Show(path);  

         }

3. ---java黑头的拖曳..必须有DragEnter事件(单独写 Drop事件是不会具有拖拽功能的)

这个功能AWT也提供了Swing话只是利用了这个,因为这和界面没什么关系。

在JAVA中使用拖拽功能

sun在java2中引入了一些新的方法来帮助实现拖拽功能,这些新的类在java.awt.dnd包中

JDK1.4开始对Swing的拖放功能做了简化,不同组件分别提供了拖放源和拖放目标,这里就讲用的最多的文本域,他既能拖入文本,也能将文本拖出,非常方便。

但默认这个功能没有启用,要手动调用setDragEnabled方法,使其生效。eg

4. 代码

---form ini()

class SetImgSoftlinkGener extends JFrame  implements Iskin, DropTargetListener

frame.setDropTarget( new DropTarget(frame,  DnDConstants.ACTION_COPY_OR_MOVE, this, true) );

@Override

public void dragEnter(DropTargetDragEvent dtde) {

System.out.println("=====enter drag enter ");

// Get the type of object being transferred and determine

// whether it is appropriate.

// checkTransferType(dtde);

// Only accept a list of files

boolean acceptableType = dtde

.isDataFlavorSupported(DataFlavor.javaFileListFlavor);

// Accept or reject the drag.

// acceptOrRejectDrag(dtde);

int dropAction = dtde.getDropAction();

int sourceActions = dtde.getSourceActions();

boolean acceptedDrag = false;

// Reject if the object being transferred

// or the operations available are not acceptable.

if (!acceptableType

|| (sourceActions & DnDConstants.ACTION_COPY_OR_MOVE) == 0) {

// DnDUtils.debugPrintln("Drop target rejecting drag");

dtde.rejectDrag();

} else if ((dropAction & DnDConstants.ACTION_COPY_OR_MOVE) == 0) {

// Not offering copy or move - suggest a copy

// DnDUtils.debugPrintln("Drop target offering COPY");

dtde.acceptDrag(DnDConstants.ACTION_COPY);

acceptedDrag = true;

} else {

// Offering an acceptable operation: accept

// DnDUtils.debugPrintln("Drop target accepting drag");

dtde.acceptDrag(dropAction);

acceptedDrag = true;

}

// return acceptedDrag;

}

@Override

public void drop(DropTargetDropEvent dtde) {

System.out.println("=====enter drag drop... ");

// Check the drop action

if ((dtde.getDropAction() & DnDConstants.ACTION_COPY_OR_MOVE) != 0) {

// Accept the drop and get the transfer data

dtde.acceptDrop(dtde.getDropAction());

Transferable transferable = dtde.getTransferable();

System.out.println("");

try {

List<File> fileList = (List) transferable

.getTransferData(DataFlavor.javaFileListFlavor);

//fileList.getClass().toString();

//String path = fileList[0].getPath();

String path=fileList.get(0).getPath();

MsgBox.setTxt(path);

System.out.println(path);

} catch (UnsupportedFlavorException | IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// dtde.dropComplete(result);

// dtde.rejectDrop();

}

}

5. 参考

在JAVA中使用拖拽功能 - gudong2945的专栏 - 博客频道 - CSDN.NET.htm

(impt )swing实现拖拽效果(将本地文件拖拽到程序的文本框中显示内容) - java学习交流 - 博客频道 - CSDN.NET.htm

疯狂JAVA讲义---第十二章:Swing编程(三)拖放功能 - TERRY的技术日志 - 博客频道 - CSDN.NET.htm

( 有点用 )java的Drag and Drop(拖拽)简单例子_javase吧_百度贴吧.htm

(简单 ) Java Swing GUI文件拖拽 - 从明白的那一刻,还不晚,启航。 - 博客频道 - CSDN.NET.htm

C#.net拖拽实现获得文件路径 - attilax的专栏 - 博客频道 - CSDN.NET.htm

WinForm的鼠标拖拽功能(C#)

C#中的拖放操作 - fumingkui@126的日志 - 网易博客.htm

winform(C#)拖拽实现获得文件路径_.NET教程网——简单专业的.NET技术网站.htm

Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结的更多相关文章

  1. atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结

    atitit.D&D drag&drop拖拽文件到界面功能 html5 web 跟个java swing c#.net c++ 的总结 1. DND的操作流程 1 2. Html5 注 ...

  2. HTML5 drag & drop 拖拽与拖放简介

    DataTransfer 对象:退拽对象用来传递的媒介,使用一般为Event.dataTransfer. draggable 属性:就是标签元素要设置draggable=true,否则不会有效果,例如 ...

  3. HTML5 drag & drop 拖拽与拖放

    关键词: 1. draggable:规定元素是否可拖动的,draggable=true可拖动 2. dataTransfer:拖拽对象用来传递的媒介,使用方式:event.dataTransfer 3 ...

  4. RCP:拖拽功能的实现 Drag and Drop

    SWT中的拖拽是使用的org.eclipse.swt.dnd. 有三个需要密切注意的类: 1.DragSource 2.DropTarget 3.Transfer DragSource封装了需要被拖拽 ...

  5. canvas drag 实现拖拽拼图小游戏

    博主一直心心念念想做一个小游戏-  前端时间终于做了一个小游戏,直到现在才来总结,哈哈- 以后要勤奋点更新博客! 实现原理 1.如何切图? 用之前的方法就是使用photoshop将图片切成相应大小的图 ...

  6. JQuery UI的拖拽功能

    JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...

  7. JQuery UI的拖拽功能实现方法小结

    JQuery UI提供的API极大简化了拖拽功能的开发.只需要分别在拖拽源(source)和目标(target)上调用draggable和droppable两个函数即可. 拖拽原理 首先要明确几个概念 ...

  8. PCB Winform中的WebBrowser扩展拖放(拖拽)功能 实现方法

    我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用, 而此WebBrowser默认情况是文件拖入功能是不支持的, 如何才能支持呢.在这里介绍如何实现方法 一 ...

  9. bcb ole拖拽功能的实现

    最近项目中用到了OLE 拖拽功能 和BCB 一个Form的Drag 不同的是,只有实现了OLE 拖拽才能,从其他程序拖拽数据到Form 下面的代码实现了,同HTML网页拖拽到Form时,Form获得H ...

随机推荐

  1. mongodb的分布式集群(2、副本集)

    概述        副本集是主从复制的一种,是一种自带故障转移功能的主从复制.攻克了上述主从复制的缺点.实现主server发生问题后.不需人为介入.系统自己主动从新选举一个新的主server的功能. ...

  2. .NET:命令行解析器介绍

    背景 经常需要开发一下小工具,之前都是自己解析命令行参数,接触过动态语言社区以后,发现命令行解析有特定的模式和框架可以利用,本文介绍一个 .NET 平台的类库. 示例 需求 拷贝文件,如:CopyFi ...

  3. C#调用API向外部程序发送数据

    C#调用API向外部程序发送数据 最近有可能要做一个项目.在项目中有这么一个功能,在A程序中调用B程序,同时在A程序中进行登陆后,要将A程序的登录名和密码自动填充到B程序的登陆对话框中,这样B程序就不 ...

  4. WPF性能调试系列 – Ants Performance Profiler

    WPF性能调试系列文章: WPF页面渲染优化:Application Timeline WPF页面业务加载优化:Ants Performance Profiler WPF内存优化:Ants Memor ...

  5. python的__slots__节约内存的魔法;检查python每一行代码内存占用情况的工具

    在Python中,每个类都有实例属性.默认情况下Python用一个字典来保存一个对象的实例属性.这非常有用,因为它允许我们在运行时去设置任意的新属性. 然而,对于有着已知属性的小类来说,它可能是个瓶颈 ...

  6. iOS:UIApplication和它对象的代理

    <1>UIApplication的对象是单例对象   类方法:UIApplication *app = [UIApplication sharedAppplication] <2&g ...

  7. 第9章 初识STM32固件库—零死角玩转STM32-F429系列

    第9章     初识STM32固件库 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  8. JavaScript:避免代码的重复执行

    我喜欢到一些大型网站上去翻阅它们的原代码,期望能找到一些可以应用到自己的代码中的模式,或发现一些之前从未听说过的工具和技巧.可是,在我查看这些大型网站的源代码时,经常会发现一个问题,那就是重复的代码执 ...

  9. .net平台推送ios消息

    1,ios应用程序中允许向客户推送消息 2,需要有苹果的证书以及密码(怎么获取,网上搜一下,需要交费的) 3,iphone手机一部,安装了该ios应用程序 4,.net 项目中引用PushSharp. ...

  10. (剑指Offer)面试题56:链表中环的入口结点

    题目: 一个链表中包含环,请找出该链表的环的入口结点. 思路: 1.哈希表 遍历整个链表,并将链表结点存入哈希表中(这里我们使用容器set),如果遍历到某个链表结点已经在set中,那么该点即为环的入口 ...