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

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并找到文件(希望在其他操作系统上也能正常工作,尚未测试)。我想要实现剪切,但我不知道如何让系统知道这就是所需的操作,或者,如何为每个成功复制的文件获取反馈,以便我可以手动从其原始位置删除它。

如果这不是不可能的,请问如何处理?我希望能够在应用程序内部进行剪切和粘贴(与与操作系统资源管理器交换文件分开)。


我认为在Java中还不能使用cut。 - rjdkolb
哦,在 Kubuntu Linux(KDE) 上,这段代码运行得非常好,除了一个问题:Java程序必须在用户粘贴文件之前不退出。在这里阅读更多信息:http://en.wikipedia.org/wiki/X_Window_selection。 - rjdkolb
2个回答

1

有另一篇帖子讨论了无法剪切文件的问题:

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

如果你真的需要,可以通过JNI调用来实现,但是这样你必须为想要支持的所有平台都这样做...这种方法很丑陋。


0

使用 Swing 可以“有点”实现。请参见 TransferHandler.exportToClipboard()。它提供了一种操作方式。正确使用 exportToClipboard() 的方法是调用 TransferHandler.getCutAction(),然后使用新创建的 ActionEvent() 调用 actionPerformed() - 我使用一个分配了 TransferHandler 的 JComponent,它将创建带有所需文件的可传输对象并放入剪贴板。

但相反的情况是不可能的。从剪贴板导入没有办法知道是剪切还是复制到剪贴板中。TransferHandler.TransferSupport.getDropAction() 仅适用于拖放操作。

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

另请参见 bug http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6673481


实际上,从Windows API中查看SetClipboardData,似乎无法分配剪切或复制操作。我敢打赌Windows Explorer使用另一个全局区域来放置此信息。 - Peter Quiring
我看不出如何利用这个。我已经使用了所有的TransferHandler内容,但是TransferHandler.exportToClipboard实际上并没有使用 action参数来执行任何不同的操作。 - Boann
它只是使用动作来调用exportDone()。你说得对,这并没有帮助。我认为Java无法做到这一点,因为剪贴板实际上并不存储操作(就我在Windows中所看到的而言)。 - Peter Quiring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接