我已经在桌子上撞了大约一个小时,现在只是试图找到一些方法来说出来......剪贴板上的一个字节数组。相反,我似乎只能找到有关如何从剪贴板中获取纯文本的信息......这根本没有用。
我已经尝试过这样做:Java getting bytes of clipboard
我也尝试过这样做:http://mrbool.com/manipulating-clipboard-content-with-java/24758
每次我遇到愚蠢的DataFlavor都是"不支持"。当然,我在这里缺少一些简单的东西......我的意思是......它如何支持纯文本,图像和java对象,但是没有具有的基本功能是所有这些?
很抱歉,如果我在这里听起来很讽刺和生气...... Java似乎对我产生了影响。 :(
答案 0 :(得分:4)
Awt剪贴板和MIME类型
InsideClipboard表示内容的MIME类型为application/spark editor
您应该能够使用构造函数DataFlavor(String mimeType, String humanReadableFormat)
创建MIME类型DataFlavor,在这种情况下,类表示将是InputStream
,您可以从中以经典方式提取字节... < / p>
但是,这个剪贴板实现对mime类型定义非常严格,你不能使用格式为id的空格,这太糟糕了,因为你的编辑器似乎在那里放了一个空格:(
可能的解决方案,如果您有权访问JavaFX
JavaFX的剪贴板管理更宽松,可以容忍各种格式名称&#34; (在InsideClipboard中调用它们)在剪贴板中,而不仅仅是像awt中的无空间type/subtype
mime格式。
例如,使用LibreOffice Draw 4.2并复制Rectangle形状,awt只能看到application/x-java-rawimage
格式,而JavaFX看到的所有格式都与InsideClipboard相同:
[application / x-java-rawimage],[PNG],[Star Object Descriptor(XML)],[cf3],[Windows Bitmap],[GDIMetaFile],[cf17],[Star Embed Source(XML) ],[绘图格式]
然后,您可以在java.nio.ByteBuffer
//with awt
DataFlavor[] availableDataFlavors = Toolkit.getDefaultToolkit().getSystemClipboard().getAvailableDataFlavors();
System.out.println("Awt detected flavors : "+availableDataFlavors.length);
for (DataFlavor f : availableDataFlavors) {
System.out.println(f);
}
//with JavaFX (called from JavaFX thread, eg start method in a javaFX Application
Set<DataFormat> contentTypes = Clipboard.getSystemClipboard().getContentTypes();
System.out.println("JavaFX detected flavors : " + contentTypes.size());
for (DataFormat s : contentTypes) {
System.out.println(s);
}
//let's attempt to extract bytes from the clipboard containing data from the game editor
// (note : some types will be automatically mapped to Java classes, and unknown types to a ByteBuffer)
// another reproducable example is type "Drawing Format" with a Rectangle shape copied from LibreOffice Draw 4.2
DataFormat df = DataFormat.lookupMimeType("application/spark editor");
if (df != null) {
Object content = Clipboard.getSystemClipboard().getContent(df);
if (content instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer) content;
System.err.println(new String(buffer.array(), "UTF-8"));
} else
System.err.println(content);
}