Java 如何将Swing应用程序拖放到windows资源管理器?

Java 如何将Swing应用程序拖放到windows资源管理器?,java,swing,drag-and-drop,Java,Swing,Drag And Drop,我想将swing组件拖放到windows资源管理器中 我发现答案与我需要的正好相反,尽管标题说的是相反的: 还发现提到OLE接口和JNI接口的答案: 还有这个线程,OP和我有完全相同的问题: 以下是一个示例,涉及将文件从JTree拖放到windows资源管理器: import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.Uns

我想将swing组件拖放到windows资源管理器中

我发现答案与我需要的正好相反,尽管标题说的是相反的:

还发现提到OLE接口和JNI接口的答案:

还有这个线程,OP和我有完全相同的问题:

以下是一个示例,涉及将文件从JTree拖放到windows资源管理器:

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.TransferHandler;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class FileBrowser implements Runnable {

    private DefaultMutableTreeNode root;

    private DefaultTreeModel treeModel;

    private JTree tree;

    @Override
    public void run() {
        JFrame frame = new JFrame("File Browser");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        File fileRoot = File.listRoots()[0];
        root = new DefaultMutableTreeNode(new FileNode(fileRoot));
        treeModel = new DefaultTreeModel(root);

        tree = new JTree(treeModel);
        tree.setShowsRootHandles(true);
        tree.setDragEnabled(true);
        tree.setTransferHandler(new FileTransferHandler());
        JScrollPane scrollPane = new JScrollPane(tree);

        frame.add(scrollPane);
        frame.setLocationByPlatform(true);
        frame.setSize(640, 480);
        frame.setVisible(true);

        CreateChildNodes ccn = new CreateChildNodes(fileRoot, root);
        new Thread(ccn).start();
    }

    public class CreateChildNodes implements Runnable {

        private DefaultMutableTreeNode root;

        private File fileRoot;

        public CreateChildNodes(File fileRoot, DefaultMutableTreeNode root) {
            this.fileRoot = fileRoot;
            this.root = root;
        }

        @Override
        public void run() {
            createChildren(fileRoot, root);
        }

        private void createChildren(File fileRoot, DefaultMutableTreeNode node) {
            File[] files = fileRoot.listFiles();
            if (files == null)
                return;

            for (File file : files) {
                DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(new FileNode(file));
                node.add(childNode);
                if (file.isDirectory()) {
                    createChildren(file, childNode);
                }
            }
        }

    }

    public class FileNode {

        private File file;

        public FileNode(File file) {
            this.file = file;
        }

        @Override
        public String toString() {
            String name = file.getName();
            if (name.equals("")) {
                return file.getAbsolutePath();
            } else {
                return name;
            }
        }
    }

    private class FileTransferHandler extends TransferHandler {

        private static final long serialVersionUID = 1L;

        @Override
        protected Transferable createTransferable(JComponent c) {
            JTree list = (JTree) c;
            List<File> files = new ArrayList<File>();
            for (TreePath path : list.getSelectionPaths()) {
                files.add(new File(Arrays.stream(path.getPath()).map(Object::toString).collect(Collectors.joining(File.separator))));
            }
            return new FileTransferable(files);
        }

        @Override
        public int getSourceActions(JComponent c) {
            return MOVE;
        }
    }

    private class FileTransferable implements Transferable {

        private List<File> files;

        public FileTransferable(List<File> files) {
            this.files = files;
        }

        public DataFlavor[] getTransferDataFlavors() {
            return new DataFlavor[] { DataFlavor.javaFileListFlavor };
        }

        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return flavor.equals(DataFlavor.javaFileListFlavor);
        }

        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
            if (!isDataFlavorSupported(flavor)) {
                throw new UnsupportedFlavorException(flavor);
            }
            return files;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new FileBrowser());
    }

}
import java.awt.datatransfer.DataFlavor;
导入java.awt.datatransfer.transfer;
导入java.awt.datatransfer.UnsupportedFlavorException;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
导入java.util.stream.collector;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTree;
导入javax.swing.SwingUtilities;
导入javax.swing.TransferHandler;
导入javax.swing.tree.DefaultMutableTreeNode;
导入javax.swing.tree.DefaultTreeModel;
导入javax.swing.tree.TreePath;
公共类FileBrowser实现可运行{
私有DefaultMutableTreeNode根;
私有DefaultTreeModel树模型;
私有JTree树;
@凌驾
公开募捐{
JFrame=newjframe(“文件浏览器”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
File fileRoot=File.listRoots()[0];
root=newdefaultmutabletreenode(newfilenode(fileRoot));
treeModel=新的DefaultTreeModel(根);
树=新的JTree(树模型);
tree.setShowsRootHandles(真);
tree.setDragEnabled(true);
setTransferHandler(新的FileTransferHandler());
JScrollPane scrollPane=新的JScrollPane(树);
frame.add(滚动窗格);
frame.setLocationByPlatform(真);
帧设置大小(640480);
frame.setVisible(true);
CreateChildNodes ccn=新的CreateChildNodes(fileRoot,root);
新线程(ccn).start();
}
公共类CreateChildNodes实现可运行{
私有DefaultMutableTreeNode根;
私有文件根目录;
公共CreateChildNodes(文件fileRoot,DefaultMutableTreeNode root){
this.fileRoot=fileRoot;
this.root=根;
}
@凌驾
公开募捐{
createChildren(fileRoot,root);
}
私有void createChildren(文件fileRoot,DefaultMutableTreeNode节点){
File[]files=fileRoot.listFiles();
if(files==null)
回来
用于(文件:文件){
DefaultMutableTreeNode childNode=新的DefaultMutableTreeNode(新文件节点(文件));
node.add(childNode);
if(file.isDirectory()){
创建子对象(文件、子节点);
}
}
}
}
公共类文件节点{
私有文件;
公共文件节点(文件){
this.file=文件;
}
@凌驾
公共字符串toString(){
字符串名称=file.getName();
if(name.equals(“”){
返回文件.getAbsolutePath();
}否则{
返回名称;
}
}
}
私有类FileTransferHandler扩展了TransferHandler{
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的可转让组件(JComponent c){
JTree list=(JTree)c;
列表文件=新的ArrayList();
对于(树路径:list.getSelectionPath()){
添加(新文件(Arrays.stream(path.getPath()).map(Object::toString.collector(Collectors.joining(File.separator))));
}
返回新文件(可转让文件);
}
@凌驾
public int getSourceActions(JComponent c){
回击动作;
}
}
私有类文件可转移实现可转移{
私人清单文件;
公共文件(列表文件){
this.files=文件;
}
公共DataFlavor[]getTransferDataFlavors(){
返回新的DataFlavor[]{DataFlavor.javaFileListFlavor};
}
支持公共布尔值IsDataFlavor(DataFlavor){
返回flavor.equals(DataFlavor.javaFileListFlavor);
}
公共对象getTransferData(DataFlavor flavor)引发不受支持的LavorException、IOException{
如果(!isDataFlavorSupported(flavor)){
抛出新的不受支持的LavorException(flavor);
}
归还文件;
}
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新文件浏览器());
}
}

在您的上一个链接中,他们发布了一个指向Java类的链接,如果您复制粘贴、编译并运行该类,并在程序的左下角启用拖放功能,您将得到一个工作示例,该示例可以处理从Swing到另一个程序的双向拖放,反之亦然。如果这不起作用,那么请发布一个适当的说明你的问题。