需要帮助从Java Application实现拖动并删除到Native File System

时间:2009-11-27 06:59:55

标签: java swing drag-and-drop

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

我需要帮助才能知道如何获取用户将所选文件/文件夹放到本机文件系统的位置。

例如,假设用户已拖动文件并通过恢复Java Application 窗口直接删除到C:\Back_Up文件夹。如何识别用户放弃文件的位置,即C:\Back_Up

5 个答案:

答案 0 :(得分:1)

AFAIK,无法获取已删除拖动对象的信息。猜猜看,你的想法是知道丢弃点并在第二步中将文件复制到该位置。

但我认为,它不会以这种方式运作,更糟糕的是,整个思想可能非常依赖操作系统。我打赌,你必须将整个文件放在转移上。我知道SWT可以实现,但SWT附带了一些原生库......

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

答案 1 :(得分:1)

谢谢Andreas .. 我们有一个JAVA组件作为表,我们从中拖动文件并删除到本机文件系统。我们有像

这样的代码

A>组件是JXTree。我们设置了以下属性来支持Drag and Drop。

Component.setDropMode(DropMode.INSERT); 

Component.setDragEnabled(true); 

DragSource ds = DragSource.getDefaultDragSource();

DragGestureRecognizer dgr = ds.createDefaultDragGestureRecognizer( Component,    
                 DnDConstants.ACTION_MOVE, new FileDragGestureListener());

B个我们编写了一个实现Drag Gesture Listener的类。

公共类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);
        }

}

class 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%,然后我们无法将该文件移动到已删除的位置。

请建议我错在哪里或实施此拖放的最佳方法。

谢谢

答案 2 :(得分:0)

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

答案 3 :(得分:0)

也许如果你一般都知道人们会放入哪些目录,你的应用程序可以创建指向这些目录的文件对象,然后使用Observer设计模式告诉你的应用程序何时被丢弃(通过轮询内容,也许)虽然如果其他程序/人员将内容放入这些目录中,您也会收到通知,但是您可以将通知发出的时间与您知道丢弃的时间进行比较。这会将其降低到几乎与您放入目录B完全相同的其他人掉入目录A的可能性很低的概率(但仍然令人不安)。

祝你好运!

答案 4 :(得分:0)

可以从JDesktop Integration Components获得一些线索:https://jdic.dev.java.net/