如何用Java将文件剪切到剪贴板?

如何用Java将文件剪切到剪贴板?,java,clipboard,Java,Clipboard,我在Java Swing应用程序中使用以下代码将文件复制到剪贴板: final List<File> files = new ArrayList<File>(); // ... code to fill list omitted ... // Toolkit.getDefaultToolkit().getSystemClipboard().setContents( new Transferable() { @Override pu

我在Java Swing应用程序中使用以下代码将文件复制到剪贴板:

final List<File> files = new ArrayList<File>();
// ... code to fill list omitted ... //

Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
    new Transferable() {
        @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 {
            return files;
        }
    }, null
);
final List files=new ArrayList();
// ... 填充列表的代码被省略//
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
新的可转让文件(){
@凌驾
公共DataFlavor[]getTransferDataFlavors(){
返回新的DataFlavor[]{DataFlavor.javaFileListFlavor};
}
@凌驾
支持公共布尔值IsDataFlavor(DataFlavor){
返回DataFlavor.javaFileListFlavor.equals(flavor);
}
@凌驾
公共对象getTransferData(DataFlavor flavor)引发不受支持的LavorException、IOException{
归还文件;
}
},空
);
它可以工作,因为我可以进入Windows资源管理器并按Ctrl+V组合键,文件就会出现(希望它可以在其他操作系统中工作,尽管没有经过测试)。我也想执行剪切,但我不知道如何让系统知道这就是操作,或者,如何获得每个成功复制文件的反馈,以便我可以手动将其从原始位置删除


如果这不是不可能的话,有没有关于我应该如何处理这件事的建议?我也希望能够在应用程序中进行剪切和粘贴(与操作系统资源管理器交换文件不同)。

还有一篇文章讨论了剪切文件的可能性不足:

如果你真的需要它,你可以走一条丑陋的路,检查是否有办法通过JNI调用来做到这一点,但是你必须为所有你想要支持的平台做到这一点…

这在某种程度上是使用Swing的可能。请参阅TransferHandler.exportToClipboard()。它提供了一种行动。使用exportToClipboard()的正确方法是调用TransferHandler.getCutAction(),然后使用新创建的ActionEvent()调用actionPerformed()——我使用一个JComponent,并分配一个TransferHandler,它将创建可转移的文件,并将所需文件放入剪贴板

但反过来是不可能的。从剪贴板导入无法知道它是被剪切还是复制到剪贴板。TransferHandler.TransferSupport.getDropAction()仅适用于DND操作

但可能是剪贴板所有者在传输完成后删除文件。请参阅TransferHandler.exportDone()


另请参见bug

我认为在Java中还不可能使用cut。哦,代码在Kubuntu linux(KDE)中工作得很好,只是Java程序在用户粘贴文件之前不能退出。阅读更多信息:实际上,从Windows API查看SetClipboardData时,您似乎无法指定剪切或复制操作。我打赌Windows资源管理器使用另一个全局区域来放置此信息。我看不出如何使用此信息。我已经使用了所有TransferHandler的内容,但是
TransferHandler.exportToClipboard
实际上没有使用
action
参数来执行任何不同的操作。它只是使用action调用exportDone()。你的权利,这没用。我认为Java做不到这一点,因为剪贴板实际上并没有存储动作(就我在Windows中看到的情况而言)。