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


    AtititD&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_MOVEthistrue) );


    @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

  • 相关阅读:
    ProjectEuler 13
    ProjectEuler 8
    ProjectEuler 5
    ProjectEuler 6
    ProjectEuler 7
    ProjectEuler 9
    日程管理系统维护改善1
    日程管理系统改错
    android作业Text
    四则运算
  • 原文地址:https://www.cnblogs.com/attilax/p/5963770.html
Copyright © 2020-2023  润新知