1、java.awt.datatransfer软件包
剪贴板与数据传输机制是由–组类及接口实现的,这些类及接口都位于java.awt . datatransfer软件包中。
类/接口名称 | 功能 |
---|---|
Clipboard类 | Transferable可以被复制到剪贴板或被从剪贴板取出 |
ClipboardOwner接口 | 将数据复制到剪贴板类的接口 |
DataFlavor类 | Transferable支持的数据风格 |
StringSelection类 | 封装文本的数据的Transferable |
Transferable接口 | 用于可放置到剪贴板的项目的接口 |
UnsuppotedFlavorSelection类 | 当请求数据格式不属于支持格式时,将被Transferable抛出 |
数据传送与剪贴板操作机制的概念:
- 首先,只有 ClipboardOwner可以向剪贴板中复制数据。
- 当将数据复制到剪贴板后,ClipboardOwner即成为剪贴板数据的拥有者。而且,只有一种类型的数据可以复制到剪贴板或者从剪贴板中取出,即 Transferable对象。
- Transferable对象不仅可以封装某种类型的数据,而且还可以按照一种或多种格式提供数据。例如,包含图像的Transferable数据可以按照两种格式提供数据—— java.awt . image实例的引用或像素数组。
2、Clipboard类
用户可通过Clipboard构造器创建一个局部剪贴板,也可以通过调用Toolkit .getSystemClipboard ()方法,获取系统剪贴板的引用。
void addFlavorListener(FlavorListener listener) //注册指定的 FlavorListener以从此剪贴板接收 FlavorEvent 。
DataFlavor[] getAvailableDataFlavors() //返回一个 DataFlavor的数组,其中可以提供此剪贴板的当前内容。
Transferable getContents(Object requestor) //返回表示剪贴板当前内容的可传输对象。
Object getData(DataFlavor flavor) //返回一个对象,该对象表示指定的 DataFlavor中此剪贴板的当前内容。
FlavorListener[] getFlavorListeners() //返回当前在 Clipboard上注册的所有 FlavorListener的数组。
String getName() //返回此剪贴板对象的名称。
boolean isDataFlavorAvailable(DataFlavor flavor) //返回是否可以在指定的 DataFlavor提供此剪贴板的当前内容。
void removeFlavorListener(FlavorListener listener) //删除指定的 FlavorListener ,使其不再从此 Clipboard收到 FlavorEvent s。
void setContents(Transferable contents, ClipboardOwner owner) //将剪贴板的当前内容设置为指定的可传输对象,并将指定的剪贴板所有者注册为新内容的所有者。
2.1 将数据复制到剪贴板及从剪贴板取出数据
将数据复制到剪贴板的操作步骤为:
- 实例化一个剪贴板或者获取某个已现的剪贴板的引用。
- 将数据封装为Transferable对象(这可能需要通过扩展Transferable实现)。
- 将数据复制到剪贴板,同时指定Transferable对象及剪贴板数据的拥有者。
//第一步
Clipboard clipboard = getToolkit().getSystemClipboard();
//第二步
StringSelection contents = new StringSelection(要封装的数据);
//第三步
clipboard.setContenets(contents,demo05.this);
从剪贴板取出数据的操作步骤为:
-
获取包含你感兴趣的数据的剪贴板引用。
-
可选步骤:判断剪贴板内容(一个Transferable对象)是否按照正确的格式提供。
-
如果当前剪贴板上的Transferable对象按照用户可接受的格式提供数据,则请求Transferable对象按照指定格式产生需要的数据。
Transferable contents = clipboard.getContents(this);
String s = (String)contents.getTransferData(DataFlavor.stringFlavor);
2.2 ClipboardOwner类
基于本地可用的数据传送功能,剪贴板内容可能并不会直接拷贝到剪贴板中,而是直到需要从剪贴板中获取该数据时,才完成拷贝工作。这种方法称之为延迟数据模式( lazy datamode),它也正是ClipboardOwner接口存在的原因。
剪贴板拥有者是指将数据放置到剪贴板上的对象,它必须确保放置到剪贴板上的数据直至调用lostOwnership方法前一直可以访问。lostOwnership ()方法是ClipboardOwner接口中定义的唯一方法。当另外一个对象向剪贴板中放置数据时,将调用该方法。如果由于某些原因,剪贴板拥有者希望释放它放置到剪贴板上的数据的相关资源,则它应该首先调用 lostOwnership ()方法,然后再执行资源释放操作。在实际使用过程中,lostOwnership()方法一般总是被实现为空操作方法。
3、数据传输
3.1 数据格式
数据格式分为两个基本类别:java类与MIME(多功能Internet邮件扩展)类型描述。
用户可以通过指定代表数据格式的特定java类构造一个DataFlavor,也可以通过指定代表数据格式的字符串构造一个DataFlavor。
3.2 Transferable对象与数据格式
方法:
Object getTransferData(DataFlavor flavor) //返回表示要传输的数据的对象。
DataFlavor[] getTransferDataFlavors() //返回DataFlavor对象的数组,指示可以提供数据的风格。
boolean isDataFlavorSupported(DataFlavor flavor) //返回此对象是否支持指定的数据flavor。
Transferable对象仅仅是一些数据块的封装体。既然指定类型的数据可以按照不同的格式打包,因此Transferable对象实际为数据块的封装体,它管理封装体中特定类型数据的格式设置。
3.3 StringSelection
java.awt . datatransfer软件包提供了能够封装文本的Transferable对象的代码实现:StringSelec-tion。StringSelection可按照如下两种格式之一显示其字符串: java .lang.String或者普通文本。
4、将图像复制到剪贴板
模仿StringSelection类,实现ClipboardOwner,Transferable接口,创建一个图像的数据格式 :
static {
ImageFlavor = new DataFlavor(Class.forName("java.awt.Image"));
}