目前只能实现纯文本的复制,如何实现类似DreamWeaver的图片的url复制?谢谢。
请参考JAVA 2 图形设计卷:第20章 剪贴板与数据传输
其中一部分:
20.6.1 ImageSelection——封装图像的Transferable对象
实现图像复制操作首先需要处理的问题是开发一个类,它实现Transferable对象并封装图像。这个类的第一个版本中,将仅仅实现图像的一种表示格式,即java.awt.image。随后,为了更好地使用,我们将增加另一外一种数据格式。
我们遵循StringSelection的命名约定,将我们需要创建的类命名为ImageSelection。另外,与StringSelection相同,为了使用方便,我们将实现ClipboardOwner接口(注:请参阅20.2.2节“ClipboardOwnerod ”。实现Transferable的类也同时实现ClipboardOwner接口是经常使用的处理方法),这样当设置剪贴板内容时可以将其内容与剪贴板拥有者指定为同一个对象:
public class imageSelection implements Transferable,ClipboardOwner{
static public DataFlavor imageFlavor;
private DataFlavor[] flavors={imageFlavor};
private Image image;
...
ImageSelection 包含DataFlavor的一个静态公共实例,客户可利用该实例指定图像按照哪种数据格式产生。既然ImageSelection只提供一种图像数据格式,其数据格式数组中将仅仅只包含一个项目。当然,调用getTransferDataFlavor方法可以返回该数组。最后,ImageSelection保持它当前代表的图像的引用。
ImageSelection实现一个创建ImageFlavor实例的静态块:
static{
try{
ImageFlavor=new DataFlavor(
Class.forName("java.awt.Image"),"AWT Image");
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
数据格式是利用Java类创建的,而不是利用MIME类创建的。另外,数据格式被命名为具有标识意义的“AWT Image”。
ImageSelection提供唯一个构造器,它使用图像的引用,实现Transferable接口所需要的3个方法:
public ImageSelection(Image image) {
this.image = image;
}
public synchronized DataFlavor[] getTransferDataFlavors() {
return flavors;
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(ImageFlavor);
}
public synchronized Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if(flavor.equals(ImageFlavor)) {
return image;
}
else {
throw new UnsupportedFlavorException(flavor);
}
}
public void lostOwnership(Clipboard c, Transferable t) {
}
如果getTransferData()请求的数据格式与ImageFlavor实例相等,则返回图像。否则,将抛出一个异常UnsupportedFlavorException另外,由于在这种情况下,ImageSelection永远不会释放与其封装图像相关的资源,因此,其lostOwnership方法被实现为空操作方法。
至此,已经完成了封装图像的Transferable对象。ImageSelection类的完整代码如程序范例20-2所示。
程序范例20-2 ImageSelection类
import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;
public class ImageSelection implements Transferable,
ClipboardOwner {
static public DataFlavor ImageFlavor;
private DataFlavor[] flavors = {ImageFlavor};
private Image image;
static {
try {
ImageFlavor = new DataFlavor(
Class.forName("java.awt.Image"), "AWT Image");
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
catch(java.util.mime.MimeTypeParseException e) {
e.printStackTrace();
}
}
public ImageSelection(Image image) {
this.image = image;
}
public synchronized DataFlavor[] getTransferDataFlavors() {
return flavors;
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(ImageFlavor);
}
public synchronized Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException {
if(flavor.equals(ImageFlavor)) {
return image;
}
else {
throw new UnsupportedFlavorException(flavor);
}
}
public void lostOwnership(Clipboard c, Transferable t) {
}
}