Java 如何将Swing应用程序拖放到windows资源管理器?
我想将swing组件拖放到windows资源管理器中 我发现答案与我需要的正好相反,尽管标题说的是相反的: 还发现提到OLE接口和JNI接口的答案: 还有这个线程,OP和我有完全相同的问题: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
以下是一个示例,涉及将文件从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到另一个程序的双向拖放,反之亦然。如果这不起作用,那么请发布一个适当的说明你的问题。