11.9.4 使用本地剪贴板传递对象引用
本地剪贴板可以保存任何类型的Java
对象,包括自定义类型的对象。为了将任意类型的Java
对象保存到剪贴板中,DataFlavor
里提供了一个javaJVMLocalObjectMimeType
的常量,该常量是一个MIME
类型字符串:application/x-java-jvm-local-Objectref
,将Java
对象放入本地剪贴板中必须使用该MIME
类型。该MIME
类型表示仅将对象引用复制到剪贴板中,对象引用只有在同一个虚拟机中才有效,所以只能使用本地剪贴板。创建本地剪贴板的代码如下:
1
| Clipboard clipboard = new Clipboard("cp");
|
创建本地剪贴板时需要传入一个字符串,该字符串是剪贴板的名字,通过这种方式允许在一个程序中创建本地剪贴板,就可以实现像Word
那种多次复制,选择剪贴板粘贴的功能。
本地剪贴板是JVM
负责维护的内存区,因此本地剪贴板会随虚拟机的结束而销毁。因此一旦Java
程序退出,本地剪贴板中的内容将会丢失
程序示例 定义Transferable
接口实现类
Java
并没有提供封装对象引用的Transferable
实现类,因此必须自己实现该接口。实现该接口与前面的ImageSelection
基本相似,一样要实现该接口的三个方法,并持有某个对象的引用。看如下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import java.awt.datatransfer.*;
public class LocalObjectSelection implements Transferable { private Object obj;
public LocalObjectSelection(Object obj) { this.obj = obj; }
public DataFlavor[] getTransferDataFlavors() { DataFlavor[] flavors = new DataFlavor[2]; Class clazz = obj.getClass(); String mimeType = "application/x-java-jvm-local-objectref;" + "class=" + clazz.getName(); try { flavors[0] = new DataFlavor(mimeType); flavors[1] = DataFlavor.stringFlavor; return flavors; } catch (ClassNotFoundException e) { e.printStackTrace(); return null; } }
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { if (!isDataFlavorSupported(flavor)) { throw new UnsupportedFlavorException(flavor); } if (flavor.equals(DataFlavor.stringFlavor)) { return obj.toString(); } return obj; }
public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.equals(DataFlavor.stringFlavor) || flavor.getPrimaryType().equals("application") && flavor.getSubType().equals("x-java-jvm-local-objectref") && flavor.getRepresentationClass().isAssignableFrom(obj.getClass()); } }
|
上面程序创建了一个DataFlavor
对象,用于表示本地Person
对象引用的数据格式。创建DataFlavor
对象可以使用如下构造器。
未完待续….