剪贴板

Java提供两种类型的剪贴板:系统的和本地的. 
本地剪贴板只在当前虚拟机中有效.Java允许多个本地剪贴板同时存在,可以方便地通过剪贴板的名称来进行存取访问.系统剪贴板与同等操作系统直接关连,允许应用程序与运行在该操作系统下的其它程序之间进行信息交换.

在进一步深入之前,先看看与剪贴板相同的java类,这些类主要包含在java.awt.datatransfer包中,主要有以下几种:
Clipboard类: 处理任何可以被传递的对象.
ClipboardOwner接口: 任何处理剪贴板的类都必须实现该接口.该接口用于剪贴板中的原始数据被替换时发出通知.
Dataflavor类: 表现被传递的对象支持的所有数据类型.
StringSelection类: java支持的一种可被传递的类.
Transferable接口: 包装传递到剪贴板的对象.
UnsupportedFlavor Exception类: 由可传递对象抛出的异常,表示不对象的数据类型(data flavor)

Clipboard类
Clipboard是存取剪贴板的链接.它包含三个方法:
String getName()
void setContents(Transferable, ClipboardOwner)
Transferable getContent(Object)
访问系统剪贴板,可以瘵系统剪贴板的引用赋值给一个Clipboard对象,如:
Clipboard clipboard = getToolKit().getSystemClipboard();
创建一个本地剪贴板,可以通过传递剪贴板的名称到构造方法中:
Clipboard clipboard = new Clipboard("My first clipboard");

ClipboardOwner接口
ClipboardOwner唯一的功能就是当(剪贴板)拥有者的数据被其它类覆盖时通知它.同时它可以用用通知应用程序释放关联到数据的资源的信号.
在具体应用中,lostOwnership方法可以用于设置标志,该标志用于通知应用有关剪贴板中数据的可见性

Java代码
java.awt.datatransfer.Clipboard clipboard=java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); //获得系统剪切板

//下面是我的记事本部分功能.e.getSource()是当触发了某个事件.这里是copy的代码,下面依此是粘贴,等代码.可以看你需要的部分.(关于clopboard的).都是汉语拼音命名的变良.

else if(e.getSource()==fuZhi||e.getSource()==fuZhi2)//Copy 'fuZhi' is 'Copy'
{
String temp=text.getSelectedText();
stringSelection=new StringSelection(temp);
clipboard.setContents(stringSelection,null);
}

else if(e.getSource()==jianQie||e.getSource()==jianQie2)//'jianQie' is 'Cut'
{
String temp=text.getSelectedText();
stringSelection=new StringSelection(temp);
clipboard.setContents(stringSelection,null);
int start=text.getSelectionStart();
int end=text.getSelectionEnd();
text.replaceRange("",start,end);
}
//这里是粘贴.主要是如何从系统剪切板里取得数据.
else if(e.getSource()==zhanTie||e.getSource()==zhanTie2)///'zhanTie' is 'Paste'.
{
java.awt.datatransfer.Transferable transferable=clipboard.getContents(this);
java.awt.datatransfer.DataFlavor flavor=java.awt.datatransfer.DataFlavor.stringFlavor;
if(transferable.isDataFlavorSupported(flavor))
{
try
{
int start=text.getSelectionStart();
int end=text.getSelectionEnd();
text.replaceRange("",start,end);
String str;
int n=text.getCaretPosition();
str=(String)transferable.getTransferData(flavor);
text.insert(str,n);
}
catch(Exception ee)
{

}
}
}
java.awt.datatransfer.Transferable transferable=clipboard.getContents(this);//传送操作提供数据的类定义接口.放在剪切板的东西都实现了这个接口.

java.awt.datatransfer.DataFlavor flavor=java.awt.datatransfer.DataFlavor.stringFlavor//在数据拖放期间,或在文件系统中,当每个实例显示在剪切板上时,它代表了数据格式的不透明概念.其实就是在系统内存中的东西是哪种类型.比如:文本,图片等.就象网页中的contentType="text/html"等一样.这里的stringFlavor是字符类型.


通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。
通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。

Java中使用java.awt.datatransfer.Clipboard类来描述剪切板,并把剪切板分为两种类型:本地和系统,本地剪切板使用 Clipborad cp = new Clipboard("clip1"); 来构造;系统剪切板通过

Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();

获取,下面我们给出几个常用的方法用于读写剪切板中的文本数据以及图像数据

1. 从指定的剪切板中获取文本内容

protected static String getClipboardText(Clipboard clip) throws Exception{
// 获取剪切板中的内容
Transferable clipT = clip.getContents(null);
if (clipT != null) {
// 检查内容是否是文本类型
if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
return (String)clipT.getTransferData(DataFlavor.stringFlavor);
}
return null;
}


2. 往剪切板写文本数据

protected static void setClipboardText(Clipboard clip, String writeMe) {
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}


3. 从剪切板读取图像

public static Image getImageFromClipboard() throws Exception{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable cc = sysc.getContents(null);
if (cc == null)
return null;
else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor))
return (Image)cc.getTransferData(DataFlavor.imageFlavor);
return null;
}


4. 写图像到剪切板

protected static void setClipboardImage2(final Image image) {
Transferable trans = new Transferable(){
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.imageFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.imageFlavor.equals(flavor);
}
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if(isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
}

};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
}


有了这四个方法,你下面可以自己写一些程序来进行测试,利用它来实现与其他程序结合测试对剪切板数据的操作。这里给出一个用于显示图像的类,只要把Image实例作为参数传入即可。

/*
* Created on 2004-12-23
* 查看图形的窗口
*/
package javayou.clipboard;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
* @author Winter Lau 用于显示图形的窗口
*/
public class ImageViewer extends Frame {

private Image image;

/**
* 显示一个图像
* @param viewMe
*/
public ImageViewer(Image viewMe) {
image = viewMe;
MediaTracker mediaTracker = new MediaTracker(this);
mediaTracker.addImage(image, 0);
try {
mediaTracker.waitForID(0);
} catch (InterruptedException ie) {
ie.printStackTrace();
System.exit(1);
}
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//窗口适应图像大小
setSize(image.getWidth(null), image.getHeight(null));
//窗口标题
setTitle("Viewing Image from Clipboard");
setVisible(true);
}

public void paint(Graphics graphics) {
graphics.drawImage(image, 0, 0, null);
}

/**
* 用于读取图像文件并生成Image对象
*/
public static Image getImageFromFile(String fileName) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage(fileName);
return image;
}

}

java.awt.datatransfer.Clipboard clipboard=java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); //获得系统剪切板

//下面是我的记事本部分功能.e.getSource()是当触发了某个事件.这里是copy的代码,下面依此是粘贴,等代码.可以看你需要的部分.(关于clopboard的).都是汉语拼音命名的变良.

else if(e.getSource()==fuZhi||e.getSource()==fuZhi2)//Copy 'fuZhi' is 'Copy'
{
String temp=text.getSelectedText();
stringSelection=new StringSelection(temp);
clipboard.setContents(stringSelection,null);
}

else if(e.getSource()==jianQie||e.getSource()==jianQie2)//'jianQie' is 'Cut'
{
String temp=text.getSelectedText();
stringSelection=new StringSelection(temp);
clipboard.setContents(stringSelection,null);
int start=text.getSelectionStart();
int end=text.getSelectionEnd();
text.replaceRange("",start,end);
}
//这里是粘贴.主要是如何从系统剪切板里取得数据.
else if(e.getSource()==zhanTie||e.getSource()==zhanTie2)///'zhanTie' is 'Paste'.
{
java.awt.datatransfer.Transferable transferable=clipboard.getContents(this);
java.awt.datatransfer.DataFlavor flavor=java.awt.datatransfer.DataFlavor.stringFlavor;
if(transferable.isDataFlavorSupported(flavor))
{
try
{
int start=text.getSelectionStart();
int end=text.getSelectionEnd();
text.replaceRange("",start,end);
String str;
int n=text.getCaretPosition();
str=(String)transferable.getTransferData(flavor);
text.insert(str,n);
}
catch(Exception ee)
{

}
}
}
java.awt.datatransfer.Transferable transferable=clipboard.getContents(this);//传送操作提供数据的类定义接口.放在剪切板的东西都实现了这个接口.

java.awt.datatransfer.DataFlavor flavor=java.awt.datatransfer.DataFlavor.stringFlavor//在数据拖放期间,或在文件系统中,当每个实例显示在剪切板上时,它代表了数据格式的不透明概念.其实就是在系统内存中的东西是哪种类型.比如:文本,图片等.就象网页中的contentType="text/html"等一样.这里的stringFlavor是字符类型.


通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。
通过操作系统的剪切板,可以实现在不同的程序中拷贝和粘贴数据。一些用Java写的程序例如很多开发环境也可以访问到剪切板,本文就是研究如何在Java程序中读写系统剪切板的数据。

Java中使用java.awt.datatransfer.Clipboard类来描述剪切板,并把剪切板分为两种类型:本地和系统,本地剪切板使用 Clipborad cp = new Clipboard("clip1"); 来构造;系统剪切板通过

Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();

获取,下面我们给出几个常用的方法用于读写剪切板中的文本数据以及图像数据

1. 从指定的剪切板中获取文本内容

protected static String getClipboardText(Clipboard clip) throws Exception{
// 获取剪切板中的内容
Transferable clipT = clip.getContents(null);
if (clipT != null) {
// 检查内容是否是文本类型
if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
return (String)clipT.getTransferData(DataFlavor.stringFlavor);
}
return null;
}


2. 往剪切板写文本数据

protected static void setClipboardText(Clipboard clip, String writeMe) {
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}


3. 从剪切板读取图像

public static Image getImageFromClipboard() throws Exception{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable cc = sysc.getContents(null);
if (cc == null)
return null;
else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor))
return (Image)cc.getTransferData(DataFlavor.imageFlavor);
return null;
}


4. 写图像到剪切板

protected static void setClipboardImage2(final Image image) {
Transferable trans = new Transferable(){
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[] { DataFlavor.imageFlavor };
}
public boolean isDataFlavorSupported(DataFlavor flavor) {
return DataFlavor.imageFlavor.equals(flavor);
}
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if(isDataFlavorSupported(flavor))
return image;
throw new UnsupportedFlavorException(flavor);
}

};
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
}


有了这四个方法,你下面可以自己写一些程序来进行测试,利用它来实现与其他程序结合测试对剪切板数据的操作。这里给出一个用于显示图像的类,只要把Image实例作为参数传入即可。

/*
* Created on 2004-12-23
* 查看图形的窗口
*/
package javayou.clipboard;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
* @author Winter Lau 用于显示图形的窗口
*/
public class ImageViewer extends Frame {

private Image image;

/**
* 显示一个图像
* @param viewMe
*/
public ImageViewer(Image viewMe) {
image = viewMe;
MediaTracker mediaTracker = new MediaTracker(this);
mediaTracker.addImage(image, 0);
try {
mediaTracker.waitForID(0);
} catch (InterruptedException ie) {
ie.printStackTrace();
System.exit(1);
}
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
//窗口适应图像大小
setSize(image.getWidth(null), image.getHeight(null));
//窗口标题
setTitle("Viewing Image from Clipboard");
setVisible(true);
}

public void paint(Graphics graphics) {
graphics.drawImage(image, 0, 0, null);
}

/**
* 用于读取图像文件并生成Image对象
*/
public static Image getImageFromFile(String fileName) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage(fileName);
return image;
}

}
很简单的啊,尝试过,没有问题!
ygxu (中级程序员) 2009-06-18
Java代码
/**

*片段

*/

Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();

else if(source == copyItem){//复制 把所选内容送到剪贴板
String text = textArea.getSelectedText();
StringSelection selection = new StringSelection(text);//复制step1:生成Transferable 接口对象。剪贴板只能放该类型的对象。 StringSelection类实现了Transferable接口。
clipBoard.setContents(selection , null);//复制step2.第二个参数是Owner。
}
else if(source == cutItem){//剪切 在复制的基础上多了一个替换。
String text = textArea.getSelectedText();
StringSelection selection = new StringSelection(text);
clipBoard.setContents(selection , null);
textArea.replaceRange("",textArea.getSelectionStart(),textArea.getSelectionEnd()); //替换为空串
}
else if(source == pasteItem){//粘贴 把剪贴板内容送到文本域
Transferable contents =clipBoard.getContents(this);//粘贴step1。
if(contents==null) return;
String text = "";
try{
text = (String)contents.getTransferData(DataFlavor.stringFlavor);//粘贴step2.
}catch(Exception exception){
System.out.println(exception.getStackTrace());
}
textArea.replaceRange(text,textArea.getSelectionStart(),textArea.getSelectionEnd()); //粘贴step3
}

/**

*片段

*/

Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();

else if(source == copyItem){//复制 把所选内容送到剪贴板
String text = textArea.getSelectedText();
StringSelection selection = new StringSelection(text);//复制step1:生成Transferable 接口对象。剪贴板只能放该类型的对象。 StringSelection类实现了Transferable接口。
clipBoard.setContents(selection , null);//复制step2.第二个参数是Owner。
}
else if(source == cutItem){//剪切 在复制的基础上多了一个替换。
String text = textArea.getSelectedText();
StringSelection selection = new StringSelection(text);
clipBoard.setContents(selection , null);
textArea.replaceRange("",textArea.getSelectionStart(),textArea.getSelectionEnd()); //替换为空串
}
else if(source == pasteItem){//粘贴 把剪贴板内容送到文本域
Transferable contents =clipBoard.getContents(this);//粘贴step1。
if(contents==null) return;
String text = "";
try{
text = (String)contents.getTransferData(DataFlavor.stringFlavor);//粘贴step2.
}catch(Exception exception){
System.out.println(exception.getStackTrace());
}
textArea.replaceRange(text,textArea.getSelectionStart(),textArea.getSelectionEnd()); //粘贴step3
}


Java代码
簡單的將String寫入到操作系統的剪貼板中,可以參考:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
public class WriteString
{
public static void main(String[] args)
{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
setClipboardString(sysc, "寫入剪貼板的String ");
}

protected static void setClipboardString(Clipboard clip, String writeMe) {
Transferable tText = new StringSelection(writeMe);
clip.setContents(tText, null);
}

}
由於拷貝String,jdk中已經有類StringSelection支持,如果要拷貝一個文件,或者目錄,則要參考此類,對其進行修改,類名:FileSelection.java (改的可能不是很成功,但能夠用)
內容為:
/* @(#)FileSelection.java 07/05/14
* @author me
* Copy file from FoxEDM,Paste to System(e.g:2000 or xp etc)
*/
package com.foxera.foxlink.ui;

import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.*;
import java.util.List;
import java.util.ArrayList;
/**
* A <code> Transferable </code> which implements the capability required
* to transfer a <code> String </code> .
*
* This <code> Transferable </code> properly supports
* <code> DataFlavor.javaFileListFlavor </code>
* and all equivalent flavors. Support for
* <code> DataFlavor.plainTextFlavor </code>
* and all equivalent flavors is <b> deprecated </b> . No other
* <code> DataFlavor </code> s are supported.
*
* @see java.awt.datatransfer.DataFlavor#javaFileListFlavor
* @see java.awt.datatransfer.DataFlavor#plainTextFlavor
*/
public class FileSelection implements Transferable, ClipboardOwner {

private static final int FILE= 0;
private static final int PLAIN_FILE = 1;

private static final DataFlavor[] flavors = {
DataFlavor.javaFileListFlavor,
DataFlavor.javaFileListFlavor
};

private List data;

/**
* Creates a <code> Transferable </code> capable of transferring
* the specified <code> String </code> .
*/
public FileSelection(List data) {
this.data = data;
}

/**
* Returns an array of flavors in which this <code> Transferable </code>
* can provide the data. <code> DataFlavor.javaFileListFlavor </code>
* is properly supported.
* Support for <code> DataFlavor.plainTextFlavor </code> is
* <b> deprecated </b> .
*
* @return an array of length two, whose elements are <code> DataFlavor.
* stringFlavor </code> and <code> DataFlavor.plainTextFlavor </code>
*/
public DataFlavor[] getTransferDataFlavors() {
// returning flavors itself would allow client code to modify
// our internal behavior
return (DataFlavor[])flavors.clone();
}

/**
* Returns whether the requested flavor is supported by this
* <code> Transferable </code> .
*
* @param flavor the requested flavor for the data
* @return true if <code> flavor </code> is equal to
* <code> DataFlavor.javaFileListFlavor </code> or
* <code> DataFlavor.plainTextFlavor </code> ; false if <code> flavor </code>
* is not one of the above flavors
* @throws NullPointerException if flavor is <code> null </code>
*/
public boolean isDataFlavorSupported(DataFlavor flavor) {
// JCK Test StringSelection0003: if 'flavor ' is null, throw NPE
for (int i = 0; i < flavors.length; i++) {
if (flavor.equals(flavors[i])) {
return true;
}
}
return false;
}

/**
* Returns the <code> Transferable </code> 's data in the requested
* <code> DataFlavor </code> if possible. If the desired flavor is
* <code> DataFlavor.javaFileListFlavor </code> , or an equivalent flavor,
* the <code> String </code> representing the selection is
* returned. If the desired flavor is
* <code> DataFlavor.plainTextFlavor </code> ,
* or an equivalent flavor, a <code> Reader </code> is returned.
* <b> Note: </b> The behavior of this method for
* </code> DataFlavor.plainTextFlavor </code>
* and equivalent <code> DataFlavor </code> s is inconsistent with the
* definition of <code> DataFlavor.plainTextFlavor </code> .
*
* @param flavor the requested flavor for the data
* @return the data in the requested flavor, as outlined above
* @throws UnsupportedFlavorException if the requested data flavor is
* not equivalent to either <code> DataFlavor.stringFlavor </code>
* or <code> DataFlavor.plainTextFlavor </code>
* @throws IOException if an IOException occurs while retrieving the data.
* By default, StringSelection never throws this exception, but a
* subclass may.
* @throws NullPointerException if flavor is <code> null </code>
* @see java.util.ArrayList <E>
*/
public Object getTransferData(DataFlavor flavor)
throws UnsupportedFlavorException, IOException
{
if (flavor.equals(flavors[FILE])) {
return (Object)data;
} else if (flavor.equals(flavors[PLAIN_FILE])) {
return new ArrayList <File> (data == null ? null : data);
} else {
throw new UnsupportedFlavorException(flavor);
}
}

public void lostOwnership(Clipboard clipboard, Transferable contents) {
}

}

測試代碼為:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.Transferable;
import java.util.List;
import java.io.File;
import java.util.ArrayList;
public class WriteFile
{
public static void main(String[] args)
{
Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();

File file = new File( "c:\\1.txt ");//目錄也可以
List <File> listFile = new ArrayList <File> ();
listFile.add(file);
setClipboardFile(sysc,listFile);
}

protected static void setClipboardFile(Clipboard clip, List writeMe) {
Transferable tFile = new FileSelection(writeMe);
clip.setContents(tFile, null);
}

}

從操作系統的剪貼板中讀取資料,可以參考:
protected static String getClipboardContent(Clipboard clip) throws Exception{
//get content from clipboard
Transferable clipT = clip.getContents(null);
if (clipT != null) {
// check content 's type
if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
{
return (String)clipT.getTransferData(DataFlavor.stringFlavor);
}
else if(clipT.isDataFlavorSupported(DataFlavor.javaFileListFlavor))
{
Object ob = clipT.getTransferData(DataFlavor.javaFileListFlavor);
List fileList = (List)ob;
if((fileList != null)&&(fileList.size() > 0))
{
for(int k=0;k <fileList.size();k++)
{
System.out.println(((File)fileList.get(k)).getAbsolutePath());
//根據路徑拷貝文件
}
}
}
}
return null;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值