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

2022-08-31 22:17:59

我的 Swing 应用程序中有一个,它保存了选定要使用的文件的文件路径。目前,我有一个用于填充此值的。但是,我想添加一种功能,让用户将文件拖放到此文件上,并让它将该文件的文件路径放入,而不是总是使用.JTextFieldJFileChooserJTextFieldJTextFieldJFileChooser

如何做到这一点?


答案 1

如果您不想花太多时间研究这个相对复杂的主题,并且您使用的是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();
        }
    }
});

答案 2

首先,您应该研究Swing DragDrop支持。之后,对于不同的操作系统,有一些小技巧。一旦你有了事情进展,你将处理drop()回调。在此回调中,您需要检查可转移的数据源。

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

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

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

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
       ....
    }
}