7

我在 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
);

它可以工作,因为我可以转到 Windows 资源管理器和 Ctrl+V 并打开文件(希望它可以在其他操作系统中工作,尽管未经测试)。我也想实现cut但我不知道如何让系统知道这就是操作,或者如何获取每个成功复制的文件的反馈,以便我可以手动将其从原始位置删除。

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

4

2 回答 2

1

还有另一篇文章,人们讨论缺乏剪切文件的可能性:

使用 SWT 将文件剪切到剪贴板

如果你真的需要它,你可以采取丑陋的方式并检查是否有办法通过 JNI 调用来做到这一点,但是你必须对你想要支持的所有平台都这样做......

于 2013-11-23T12:49:57.190 回答
0

这在使用 Swing 时“有点”可能。请参阅 TransferHandler.exportToClipboard()。它提供了一个动作。使用 exportToClipboard() 的正确方法是调用 TransferHandler.getCutAction() 然后使用新创建的 ActionEvent() 调用 actionPerformed() - 我使用分配有 TransferHandler 的 JComponent 将创建带有所需文件的 Transferable 放入剪贴板.

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

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

另请参阅错误http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6673481

于 2014-10-28T16:24:46.517 回答