如何在 Swing 中使用拖放来获取文件路径?

新手上路,请多包涵

我的 Swing 应用程序中有一个 JTextField ,它包含选择使用的文件的文件路径。目前我有一个 JFileChooser 用于填充此值。但是,我想为用户添加将文件拖放到此 JTextField 并将该文件的文件路径放入 JTextField 而不是总是使用 JFileChooser

如何才能做到这一点?

原文由 Ascalonian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 569
2 个回答

首先,您应该研究 Swing DragDrop 支持。之后,针对不同的操作系统几乎没有什么小技巧。一旦一切顺利,您将处理 drop() 回调。在此回调中,您需要检查 Transferable 的 DataFlavor。

对于 Windows,您可以只检查 DataFlavor.isFlavorJavaFileListType() 然后像这样获取数据

List<File> dropppedFiles = (List<File>)transferable.getTransferData(DataFlavor.javaFileListFlavor)

对于 Linux(可能还有 Solaris),DataFlavor 有点棘手。您需要制作自己的 DataFlavor 并且 Transferable 类型会有所不同

nixFileDataFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
String data = (String)transferable.getTransferData(nixFileDataFlavor);
for(StringTokenizer st = new StringTokenizer(data, "\r\n"); st.hasMoreTokens();)
{
    String token = st.nextToken().trim();
    if(token.startsWith("#") || token.isEmpty())
    {
         // comment line, by RFC 2483
         continue;
    }
    try
    {
         File file = new File(new URI(token))
         // store this somewhere
    }
    catch(...)
    {
       // do something good
       ....
    }
}

原文由 basszero 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果您不想花太多时间研究这个相对复杂的主题,并且您使用的是 Java 7 或更高版本,这里有一个快速示例,说明如何使用 JTextArea 接受丢弃的文件作为丢弃目标:

 JTextArea myPanel = new JTextArea();
myPanel.setDropTarget(new DropTarget() {
    public synchronized void drop(DropTargetDropEvent evt) {
        try {
            evt.acceptDrop(DnDConstants.ACTION_COPY);
            List<File> droppedFiles = (List<File>)
                evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
            for (File file : droppedFiles) {
                // process files
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
});

原文由 rustyx 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题