java.awt.datatransfer.*
由于数据具有各种各样的格式,为了方便,java用Transferable封装了要传递的数据,用DataFlavor封装了数据格式。
Transferable
Transferable
getTransferDataFlavors() : DataFlavor[]
支持的数据格式
isDataFlavorSupported(DataFlavor flavor) : boolean
数据格式是否支持
getTransferData(DataFlavor flavor) : Object
取出数据,它可抛出两个异常:
UnsupportedFlavorException
IOException
DataFlavor
对MIME类型的封装
DataFlavor表示数据格式,它封装了MIME类型,它可以有一个class参数,用于加载数据所代表的类。
MIME类型语法一般在HTTP请求中作为ContentType的值:
ContentType: /;
如果数据是一个Java类,那么就要附加一个class参数,用于加载数据所代表的类:
/; class=
举例个例子:
image/x-java-image; class=java.awt.Image
primary type : image
subtype : x-java-image
representation class : java.awt.Image
如果数据不是Java类,那么representation class则为java.io.InputStream;如果数据是文本,它可以有一个charset参数,用于指定字符集:
text/html; charest=utf-8
两个DataFlavor的equals原则
满足下列条件
primary type相等
subtype相等
representation class相等
此外如果primary type是text,那么就是一个支持charset参数文本格式,并且如果representation class不是java.io.Reader, java.lang.String, java.nio.CharBuffer 或 [C(这个源代码中文档注释的[C不知道是什么意思,可能是作者笔误,难道是Ctrl+C),那么charset必须也相等。如果没有给其中一个或两个DataFlavor指定charset,那么使用平台默认字符集。支持charset参数的文本格式清单详见selectBestTextFlavor。
构造器
DataFlavor有几个构造器:
DataFlavor()
这个构造器仅用于为了支持Externalizable interface的目的。它不打算公开使用
DataFlavor(Class> representationClass, String humanPresentableName)
representationClass:数据所代表的类
humanPresentableName:用于标识数据格式的可读字符串,如果为null,那么application/x-java-serialized-object将作为它的值。
返回的DataFlavor:
representationClass = representationClass
mimeType = application/x-java-serialized-object;
humanPresentableName = application/x-java-serialized-object
DataFlavor(String mimeType, String humanPresentableName, ClassLoader classLoader)
DataFlavor(String mimeType, String humanPresentableName)
DataFlavor(String mimeType)
mimeType:MIME Type ,如果没有class= 参数,或如果这个class= 代表的类没有成功加载,那么将抛出IllegalArgumentException异常。
humanPresentableName:同上。
classLoader: 类加载器。
如果mimeType的值是"/; class=",那么它将同样会调用new DataFlavor(Class.forName()。否则:
representationClass =
mimeType = /; class=
humanPresentableName = /
throws ClassNotFoundException
throws IllegalArgumentException
内置格式
DataFlavor.stringFlavor
application/x-java-serialized-object; class=java.lang.String
DataFlavor.imageFlavor
image/x-java-image; class=java.awt.Image
DataFlavor.javaFileListFlavor
application/x-java-file-list; class=java.util.List
DataFlavor.selectionHtmlFlavor
text/html; document=selection; class=java.lang.String; charset=Unicode
DataFlavor.fragmentHtmlFlavor
text/html; document=fragment; class=java.lang.String; charset=Unicode
DataFlavor.allHtmlFlavor
text/html; document=all; class=java.lang.String; charset=Unicode
内置MIME
DataFlavor.javaSerializedObjectMimeType
application/x-java-serialized-object
DataFlavor.javaJVMLocalObjectMimeType
application/x-java-jvm-local-objectref
DataFlavor.javaRemoteObjectMimeType
application/x-java-remote-object
示例代码
图片数据
public class ImageSelection implements Transferable {
private Image image;
public ImageSelection(Image image) {
this.image = image;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {DataFlavor.imageFlavor};
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if(isDataFlavorSupported(flavor)) return image;
throw new UnsupportedFlavorException(flavor);
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(DataFlavor.imageFlavor);
}
}
Java对象数据
可以在两个JVM间中传递
public class ObjectSelection implements Transferable {
private Object obj;
private DataFlavor objectFlavor;
public ObjectSelection(Object obj) {
this.obj = obj;
try {
this.flavor = new DataFlavor(getMimeType());
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] {objectFlavor};
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (isDataFlavorSupported(flavor)) return obj;
throw new UnsupportedFlavorException(flavor);
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(objectFlavor);
}
private String getMimeType() {
return DataFlavor.javaJVMLocalObjectMimeType + "; class=" + obj.getClass().getName();
}
}