【问题标题】:Require help to implement drag from Java Application and drop to Native File System需要帮助以实现从 Java 应用程序拖放到本机文件系统
【发布时间】:2010-12-20 21:36:51
【问题描述】:

我有一个 Java Swing 应用程序,它显示了已上传到服务器的文件/文件夹的列表。我需要使用 Drag and Drop 将选定的文件/文件夹下载到本机文件系统。我搜索了链接,但几乎每个链接都描述了 Java Swing 应用程序中的拖放。我的要求是将文件从 Java Swing 应用程序拖放到本机文件系统。

我需要帮助来了解如何获取用户将所选文件/文件夹拖放到本机文件系统的位置。

例如,假设用户通过恢复Java应用程序的窗口将文件直接拖放到C:\Back_Up文件夹中。如何识别用户将文件拖放到的位置,即C:\Back_Up?

【问题讨论】:

  • 一旦它离开 java 应用程序,我认为你不知道它被丢弃在哪里。
  • 我把一个难以理解的部分用斜体表示,请修复。

标签: java swing drag-and-drop


【解决方案1】:

AFAIK,无法获取已拖放对象的信息。猜猜,您的想法是知道放置点并在第二步中将文件复制到该位置。

但我认为,这种方式行不通,更糟糕的是,整个想法可能非常依赖于操作系统。我敢打赌,您必须将整个文件放在传输中。我知道使用 SWT 是可能的,但是 SWT 附带了一些本机库...

这里至少有一个链接显示了相反的示例:Drag and drop of a group of files into a tree

【讨论】:

    【解决方案2】:

    谢谢安德烈亚斯.. 我们有一个作为表格的 JAVA 组件,我们从中拖动文件并拖放到本机文件系统。我们有类似

    的代码

    A> 组件是 JXTree。我们设置了以下属性来支持拖放。

    Component.setDropMode(DropMode.INSERT); 
    
    Component.setDragEnabled(true); 
    
    DragSource ds = DragSource.getDefaultDragSource();
    
    DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer( Component,    
                     DnDConstants.ACTION_MOVE, new FileDragGestureListener());
    

    B> 我们编写了一个实现拖动手势监听器的类。

    公共类 FileDragGestureListener 扩展 DragSourceAdapter 实现 DragGestureListener {

    public void dragGestureRecognized(DragGestureEvent dge) {

     We get selected row from table.
     Download the selected File to Native file System's TEMP directory. 
    FileSystemView fsv = FileSystemView.getFileSystemView();
    Icon icn = fsv.getSystemIcon(File);
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension dim = tk.getBestCursorSize(icn.getIconWidth(), icn.getIconHeight());
    BufferedImage buff = new BufferedImage(dim.width, dim.height,   
                                        BufferedImage.TYPE_INT_ARGB);
    if (DragSource.isDragImageSupported()) {
                evt.startDrag(DragSource.DefaultCopyDrop, buff, new Point(0, 0),
                        new TextFileTransferable(File),
                        this);
            } else {
                cursor = tk.createCustomCursor(buff, new Point(0, 0), "sString");
                evt.startDrag(cursor, null, new Point(0, 0),
                        new TextFileTransferable(File),
                        this);
            }
    
    }
    

    类 TextFileTransferable 实现 Transferable {

    File temp;
    
    
    
    
    public TextFileTransferable(File temp) throws IOException {
    
        this.temp = temp;
    }
    
    public Object getTransferData(DataFlavor flavor) {
         List list = new ArrayList();
        list.add(temp);
        return list;
    }
    
    public DataFlavor[] getTransferDataFlavors() {
    
        DataFlavor[] df = new DataFlavor[1];
        df[0] = DataFlavor.javaFileListFlavor;
        return df;
    }
    
    public boolean isDataFlavorSupported(DataFlavor flavor) {
    
    
        if (flavor == DataFlavor.javaFileListFlavor) {
            return true;
        }
        return false;
    }
    

    }

    所以这就是我们如何能够将文件下载到 %TEMP% 然后我们不能将该文件移动到已删除的位置。

    请提出我错在哪里或实现此拖放的最佳方法。

    谢谢

    【讨论】:

    • 请检查您的代码块和突出显示,这有点难以阅读:)
    • 这是对您问题的回答吗?我认为您想删除此答案并改为编辑您的问题?
    【解决方案3】:

    我相信Java Desktop API 可以做到这一点。虽然不确定细节...

    【讨论】:

      【解决方案4】:

      也许如果您通常知道人们会放入哪些目录,您的应用程序可以创建指向这些目录的文件对象,然后使用观察者设计模式告诉您的应用程序什么时候放入其中(通过轮询内容,也许)虽然如果其他程序/人将东西放入这些目录中,您也会收到通知,但是您可以将收到通知的时间与您知道您做了一些丢弃的时间进行比较。这会将它降低到可以说是低概率(但仍然有可能)的情况,即其他人几乎在您进入目录 B 的同时进入目录 A。

      祝你好运!

      【讨论】:

        【解决方案5】:

        一些线索可以从 JDesktop 集成组件中获得:https://jdic.dev.java.net/

        【讨论】:

          猜你喜欢
          • 2011-08-16
          • 1970-01-01
          • 2012-02-29
          • 1970-01-01
          • 2013-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多