Java开发设计图型应用软件的盆友一定遇到过怎样在程序流程中完成拷贝图象的作用。在jdk1.4之前,java本身就适用将程序流程中文字串拷贝给其他的非java应用软件应用,而将程序流程中的图象拷贝到非java应用软件真是十分困难。只到jdk1.4出去,这个问题才得到处理。
一般大家开发设计java application页面,关键用swing图形包。基本上全部的swing控制全是由JComponent承继而成的。假如我们要获得JComponent的图象,可以用下列方法:
Rectangle rect = comp.getBounds();
BufferedImage bufImage = new BufferedImage(rect.width,
rect.height,
BufferedImage.TYPE_INT_RGB);
Graphics g = bufImage.getGraphics();
g.translate(-rect.x, -rect.y);
comp.paint(g);
那样的话,图象就储存到BufferedImage目标之中了。
如今看来如何把这一BufferedImage拷贝到系统软件clipboard中。要做拷贝作用,一般是承继TransferHandler类,完成Transferable插口, 那样你的拷贝內容才可以传入系统软件clipboard,因此大家来写一个ImageSelection类:
import java.awt.*;
import java.awt.image.*;
import java.awt.datatransfer.*;
import javax.swing.*;
public class ImageSelection extends TransferHandler
implements Transferable
{
private static final DataFlavor flavors[] =
{DataFlavor.imageFlavor};
private Image image;
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
public boolean canImport(JComponent comp, DataFlavor
flavor[]) {
for (int i=0, n=flavor.length; i
if (flavor[i].equals(flavors[0])) {
return true;
}
}
return false;
}
//将图象拷贝到Image目标.
public Transferable createTransferable(JComponent
comp) {
// Clear clip
image = null;
Icon icon = null;
Rectangle rect = comp.getBounds();
BufferedImage bufImage = new BufferedImage(rect.width,
rect.height,
BufferedImage.TYPE_INT_RGB);
Graphics g = bufImage.getGraphics();
comp.paint(g);
if (bufImage != null ) {
image = bufImage;
return this;
}
return null;
}
// Transferable
public Object getTransferData(DataFlavor flavor) {
if (isDataFlavorSupported(flavor)) {
return image;
}
return null;
}
public DataFlavor[] getTransferDataFlavors() {
return flavors;
}
public boolean isDataFlavorSupported(DataFlavor
flavor) {
return flavor.equals(flavors[0]);
}
}
运用这一类,就可以轻轻松松的将JComponent图像拷贝到系统软件clipboard了.如何使用呢,再讨论一下下边的编码:
final Clipboard clipboard =
kit.getSystemClipboard();
Icon icon = new ImageIcon("myphoto.jpg");
final JLabel label = new JLabel(icon);
label.setTransferHandler(new ImageSelection());
JButton copy = new JButton("Label Copy");
copy.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
TransferHandler handler =
label.getTransferHandler();
handler.exportToClipboard(label, clipboard,
TransferHandler.COPY);
}
});
在你的程序流程中,要有一个JFrame, 再加上一个JLabel,一个JButton,将上边的编码加进到,你也就能够在你的程序流程中见到图象如何复制到系统软件clipboard了.