如何使用Java复制文件并将其粘贴到剪贴板?

如何使用Java复制文件并将其粘贴到剪贴板?,java,Java,如何使用Java复制文件并将其粘贴到剪贴板?我的程序可以复制,但不能粘贴。它给 线程“main”java.lang.ClassCastException中的异常: 无法将java.util.Arrays$ArrayList转换为java.io.File 我的代码: class FileTransferable implements Transferable { private final File file; public FileTransferable(File file)

如何使用Java复制文件并将其粘贴到剪贴板?我的程序可以复制,但不能粘贴。它给

线程“main”java.lang.ClassCastException中的异常:
无法将java.util.Arrays$ArrayList转换为java.io.File

我的代码:

class FileTransferable implements Transferable {
    private final File file;

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

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

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

    @Override
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        final ArrayList<File> files = new ArrayList<File>();
        files.add(file);
        return files;
    }
}
类文件可转移{
私人最终文件;
公共文件可转移(文件){
this.file=文件;
}
@凌驾
公共DataFlavor[]getTransferDataFlavors(){
返回新的DataFlavor[]{DataFlavor.javaFileListFlavor};
}
@凌驾
支持公共布尔值IsDataFlavor(DataFlavor){
返回DataFlavor.javaFileListFlavor.equals(flavor);
}
@凌驾
公共对象getTransferData(DataFlavor flavor)引发不受支持的LavorException、IOException{
最终ArrayList文件=新ArrayList();
文件。添加(文件);
归还文件;
}
}

Java无法处理特定的操作系统相关操作,如干扰剪贴板等,因为它是一种独立于平台的语言。在JLS和Java API中,没有用于剪贴板干扰的方法,但是有一些方法可以处理Java API中声明的文件系统操作,这些操作是在大多数JVM实现中实现的JLS(Java语言规范)的一部分


要做到这一点,您应该使用JNI(Java本机接口)在C/C++(使用Win32 API等)中本机开发一些东西,或者使用现成的二进制文件,并在Java应用程序中调用它们。

我无法检测到实际代码中的任何问题。我猜,强制转换错误发生在您实际从复制/粘贴操作接收内容的地方,您收到一个文件,包装在列表中,并且可能将列表强制转换为
文件

以下是一个完整的示例,该示例取自DGuitar源代码,前提是我根据您的评论删除了自定义或特定的详细信息

/*
 * ADropTargetListener
 * Created on 20/04/2005
 *
 *
 */

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


/**
 * The Drop action happens in this order: 1. dragEnter =
when the mouse enters
 * the component 2. dragOver = after the mouse has entered
but has not been
 * released 3. drop = when the mouse is released
 * 
 * @author Mauricio Gracia G
 */
public class ADropTargetListener implements DropTargetListener {
    /**
     * creates a DropTargetListener 
     */
    public ADropTargetListener() {

    }

    /**
     * overrides the DROP method.
     * 
     * @see java.awt.dnd.DropTargetListener#drop(java.awt.dnd.DropTargetDropEvent)
     */
    public void drop(DropTargetDropEvent dtde) {
        Transferable transfer;

        transfer = dtde.getTransferable();

        //we must accept the transfer to process it
        dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);

        importData(transfer);
    }
    /**
     * Imports the data of the Drop action
     * @param t the transferable object
     */

    public void importData(Transferable t) {
        if (canImport(t.getTransferDataFlavors())) {
            try {
                DataFlavor[] flavors = t.getTransferDataFlavors();
                for (int i = 0; i < flavors.length; i++) {
                    //       Drop from Windows
                    if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {

                        Object gtd ;

                        gtd = t.getTransferData(DataFlavor.javaFileListFlavor) ;
                        if (gtd instanceof List) {
                            @SuppressWarnings("unchecked")
                            List<File> fileList = (List<File>) gtd;

                                                        //YOUR CODE here to process the list of Files

                        }

                    }
                    //       Drop from GNOME or kde
                    // delimited by \n  (\r\n) on gnome
                    // will need to remove file:// at start
                    else if (DataFlavor.stringFlavor.equals(flavors[i])) {
                        if (t.getTransferData(DataFlavor.stringFlavor)
instanceof String) {
                            String path = (String) t
                                    .getTransferData(DataFlavor.stringFlavor);
                            List<File> fileList = convertStringsToFileList(path);
                            //YOUR CODE here to process the list of Files

                        }

                    }
                }
            } catch (UnsupportedFlavorException e) {
                e.printStackTrace();

            } catch (IOException e) {
                e.printStackTrace();

            }
        }
    }
    /**
     * converts Strings in certain format to a FileList 
     * @param filestr   the list of files in a single string
     * @return          a list of files
     */

    private ArrayList<File> convertStringsToFileList(String filestr) {
        ArrayList<File> files = new ArrayList<File>();
        String[] tokenizedFiles = filestr.split("\n");
        for (int i = 0; i < tokenizedFiles.length; i++) {
            String path = tokenizedFiles[i];
            if (path.startsWith("file://")) {
                if (path.endsWith("\r")) {
                    //appears to be the case for gnome but not kde
                    path = path.substring(7);
                    path = path.replaceAll("\r", "");

                    path = path.replaceAll("%20", " ");
                } else {
                    path = path.substring(7);
                }
            }
            files.add(new File(path));

        }
        return files;
    }
    /**
     * Determine if it can import certain flavor
     * 
     * @param flavors   an array of DataFlavors
     * @return true or not depending on the flavor
     */
    public boolean canImport(DataFlavor[] flavors) {
        for (int i = 0; i < flavors.length; i++) {
            if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {
                return true;
            } else if (DataFlavor.stringFlavor.equals(flavors[i])) {
                return true;
            }
        }
        return false;
    }


    /**
     * method that is called when the drag starts or enters the window
     * @param dtde a DropTargetDragEvent
     * 
     * @see java.awt.dnd.DropTargetListener#dragEnter(java.awt.dnd.DropTargetDragEvent)
     */
    public void dragEnter(DropTargetDragEvent dtde) {
        //DEBUG
        //System.out.println("dragEnter" + ":" + dtde) ;
    }

    /**
     * a method that is called when the DRAG is OVER ??
     * 
     * @see java.awt.dnd.DropTargetListener#dragOver(java.awt.dnd.DropTargetDragEvent)
     */

    public void dragOver(DropTargetDragEvent dtde) {
        //      DEBUG
        //System.out.println("dragOver" + ":" + dtde) ;
    }

    /**
     * when the drop action is changes this method is called
     * 
     * @see java.awt.dnd.DropTargetListener#dropActionChanged(java.awt.dnd.DropTargetDragEvent)
     */
    public void dropActionChanged(DropTargetDragEvent dtde) {
        //      DEBUG
        //System.out.println("dropActionChanged" + ":" + dtde) ;
    }

    /**
     * method called when the drag exits the window
     * 
     * @see java.awt.dnd.DropTargetListener#dragExit(java.awt.dnd.DropTargetEvent)
     */
    public void dragExit(DropTargetEvent dte) {
        //      DEBUG
        //System.out.println("dragExit" + ":" + dte) ;
    }

}
/*
*ADropTargetListener
*创建于2005年4月20日
*
*
*/
导入java.awt.datatransfer.DataFlavor;
导入java.awt.datatransfer.transfer;
导入java.awt.datatransfer.UnsupportedFlavorException;
导入java.awt.dnd.DnDConstants;
导入java.awt.dnd.dropTargetDrageEvent;
导入java.awt.dnd.DropTargetDropEvent;
导入java.awt.dnd.DropTargetEvent;
导入java.awt.dnd.DropTargetListener;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
/**
*放置操作按以下顺序进行:1。排水剂=
当鼠标进入
*构成部分2。dragOver=鼠标进入后
但一直没有
*第三次发布。drop=释放鼠标时
* 
*@作者毛里西奥·格雷西亚G
*/
公共类ADropTargetListener实现DropTargetListener{
/**
*创建DropTargetListener
*/
公共ADropTargetListener(){
}
/**
*覆盖DROP方法。
* 
*@see java.awt.dnd.DropTargetListener#drop(java.awt.dnd.DropTargetDropEvent)
*/
公共作废删除(DropTargetDropEvent dtde){
可转让转让转让;
transfer=dtde.getTransferable();
//我们必须接受转让才能处理它
dtde.acceptDrop(DnDConstants.ACTION\u COPY\u或\u MOVE);
输入数据(传输);
}
/**
*导入删除操作的数据
*@param t可转移对象
*/
公共无效导入数据(可转让){
if(canImport(t.getTransferDataFlavors()){
试一试{
DataFlavor[]flavors=t.getTransferDataFlavors();
for(int i=0;i