我目前正在研究可以将文件复制到系统剪贴板的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" );
返回flavor的数据的方法:
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 );
}
谢谢, 安德烈
答案 0 :(得分:0)
也许你应该试试DataFlavor#javaFileListFlavor。
摘自API文档:
DataFlavor#javaFileListFlavor (Link)
要向/从Java(和底层平台)传输文件列表,使用此类型/子类型的DataFlavor和java.util.List的表示类。列表的每个元素都必须/保证是java.io.File类型。
答案 1 :(得分:0)
我做了一个小调查,这是答案:
它应该与
一起使用DataFlavor#javaFileListFlavor
但是,对于所有基于OpenJDK的JDK,文件的复制粘贴功能在本机端均已损坏。
OpenJDK实现使用NSPasteboard.sendData
格式的NSFilenamesPboardType
方法。不幸的是,NSFilenamesPboardType is deprecated and removed after 10.14。
因此,该功能可在10.13及更高版本中使用,但在该版本之后将无法使用。
有两种可能的解决方案:
我发现了NSPasteboardAPI库,它提供了适当的本机API。 Here是基于库的Java实现。
我已经在本地的JetBrains Runtime中修复了该问题,因此可以按照您的期望与DataFlavor#javaFileListFlavor
一起使用。
有趣的是,此刻此问题存在约10年。 我相信它将在一些即将发布的OpenJDK版本中得到修复,但是我不确定何时。