我有一个Java Swing应用程序,它显示已上载到服务器的文件/文件夹列表。我需要使用拖放功能将所选文件/文件夹下载到本机文件系统。我搜索了链接,但几乎每个链接都描述了Java Swing应用程序中的拖放。我的要求是从Java Swing应用程序拖动文件并将其拖放到本机文件系统。
我需要帮助才能知道如何获取用户将所选文件/文件夹放到本机文件系统的位置。
例如,假设用户已拖动文件并通过恢复Java Application 窗口直接删除到C:\Back_Up
文件夹。如何识别用户放弃文件的位置,即C:\Back_Up
?
答案 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/