【问题标题】:What is the required DataFlavor to copy files in Mac OSX在 Mac OSX 中复制文件需要什么 DataFlavor
【发布时间】:2011-03-14 19:19:25
【问题描述】:

我目前正在研究可以将文件复制到系统剪贴板中的 Java 代码。

对于 Windows 和 Linux,我已经开始使用它了。对于 OSX,我尝试了几种风格,但 Finder 中的“粘贴”操作从未激活。

知道 Finder 需要哪些 DataFlavor 设置吗?

使用过的口味:

DataFlavor.javaFileListFlavor
URILIST_FLAVOR = new DataFlavor( "text/uri-list" );
XFILELIST_FLAVOR = new DataFlavor( "application/x-java-file-list" );
GNOMEFILELIST_FLAVOR = new DataFlavor( "x-special/gnome-copied-files" );

返回风味数据的方法:

public Object getTransferData( DataFlavor flavor ) throws UnsupportedFlavorException, IOException {
    if( FILELIST_FLAVOR.equals( flavor ) ) {
        if( List.class == flavor.getRepresentationClass() ) {
            return Arrays.asList( files );
        } else if( InputStream.class == flavor.getRepresentationClass() ) {
            return getStreamData( files, null );
        }
    } else if( DataFlavor.javaFileListFlavor.equals( flavor ) ) {
        if( List.class == flavor.getRepresentationClass() ) {
            return locallist;
        } else if( InputStream.class == flavor.getRepresentationClass() ) {
            return getStreamData( files, null );
        }
    } else if( URILIST_FLAVOR.equals( flavor ) ) {
        if( List.class == flavor.getRepresentationClass() ) {
            return Arrays.asList( files );
        } else if( InputStream.class == flavor.getRepresentationClass() ) {
            return getStreamData( files, null );
        }
    } else if( GNOMEFILELIST_FLAVOR.equals( flavor ) ) {
        if( List.class == flavor.getRepresentationClass() ) {
            return Arrays.asList( files );
        } else if( InputStream.class == flavor.getRepresentationClass() ) {
            // FIXME support cut and copy
            return getStreamData( files, "copy" );
        }
    } else if( XFILELIST_FLAVOR.equals( flavor ) ) {
        if( List.class == flavor.getRepresentationClass() ) {
            return locallist;
        } else if( InputStream.class == flavor.getRepresentationClass() ) {
            return getStreamData( files, null );
        }
    }
    throw new UnsupportedFlavorException( flavor );
}

谢谢, 安德烈

【问题讨论】:

    标签: java macos copy-paste


    【解决方案1】:

    也许你应该试试DataFlavor#javaFileListFlavor

    API 文档节选:

    DataFlavor#javaFileListFlavor (Link)

    为了向/从 Java(和底层平台)传输文件列表,使用了这种类型/子类型的 DataFlavor 和 java.util.List 的表示类。列表的每个元素都必须/保证为 java.io.File 类型。

    【讨论】:

    • 顺便...System.out.println(DataFlavor.javaFileListFlavor.getMimeType());的结果是application/x-java-file-list; class=java.util.List
    • 请看我的问题:javaFileListFlavor 已被处理。 Finder 不使用这种风格。
    • 哦……这确实很奇怪。
    【解决方案2】:

    我做了一个小调查,答案如下:

    它应该适用于

    DataFlavor#javaFileListFlavor
    

    但是对于所有基于 OpenJDK 的 JDK,文件的复制粘贴功能在本机端被破坏了。

    OpenJDK 实现使用NSPasteboard.sendData 方法,格式为NSFilenamesPboardType。不幸的是,NSFilenamesPboardType is deprecated and removed after 10.14。 因此该功能在 10.13 及之前的版本中有效,但在版本之后被破坏。

    有几种可能的解决方案:

    1. 我找到了提供适当本机 API 的 NSPasteboardAPI 库。 Here是基于该库的java实现。

    2. 我已经解决了本机端 JetBrains Runtime 中的问题,因此它只适用于 DataFlavor#javaFileListFlavor,正如您所期望的那样。

    有趣的是,这个问题现在已经存在了大约 10 年。 我相信它也会在一些即将发布的 OpenJDK 版本中得到修复,但我不确定何时。

    【讨论】:

    • 也许你可以打开一个错误报告——除非已经有一个(我没有检查)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多