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.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实例作为参数传入即可。
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;
public class ImageViewer extends Frame {
private Image image;
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);
}
public static Image getImageFromFile(String fileName) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage(fileName);
return image;
}
}
====================================================================================================================================
原文链接:
Java中有关剪切板的操作
Java提供两种类型的剪贴板:系统的和本地的.
本地剪贴板只在当前虚拟机中有效.Java允许多个本地剪贴板同时存在,可以方便地通过剪贴板的名称来进行存取访问.
系统剪贴板与同等操作系统直接关连,允许应用程序与运行在该操作系统下的其它程序之间进行信息交换.
在进一步深入之前,先看看与剪贴板相同的java类,这些类主要包含在java.awt.datatransfer包中,主要有以下几种:
Clipboard类: 此类实现一种使用剪切/复制/粘贴操作传输数据的机制.
ClipboardOwner接口: 任何处理剪贴板的类都必须实现该接口.该接口用于剪贴板中的原始数据被替换时发出通知.
Dataflavor类: 提供有关数据的元信息,通常用于访问剪切板上的数据。
Transferable接口: 为传输操作提供数据所使用的类的接口
StringSelection类: 实现传输String所需能力的Transferable
Clipboard类:方法
返回剪切板对象的名字
2.setContents(Transferable contents,ClipOwner owner);
讲剪切板的内容设置到指定的Transferable对象,并将指定的剪切板所有者作为新内容的所有者注册
3.Transferable getContents(null);
返回表示剪贴板当前内容的 transferable 对象。无则null
4.DataFlavor[] getAvailableDataFlavors();
返回 DataFlavor 的数组,其中提供了此剪贴板的当前内容。无则null
5.boolean isDataFlavorAvailable(DataFlavor flavor);
返回是否能够以指定的 DataFlavor 形式提供此剪贴板的当前内容。
6.Object getData(DataFlavor flavor);
返回一个对象,表示此剪贴板中指定 DataFlavor 类型的当前内容。
Transferable接口:
属性:
1.stringFlavor:字符串数据
2.imageFlavor:图片数据
方法:
1.Object getTransferData(DataFlavor flavor)
返回一个对象,该对象表示将要被传输的数据。
2.DataFlavorgetTransferDataFlavors()
返回 DataFlavor 对象的数组,指示可用于提供数据的
3.boolean isDataFlavorSupported(DataFlavor flavor)
返回此对象是否支持指定的数据
例子:1.往剪切板里面写文本数据
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable trandata = new StringSelection("4654654");
clipboard.setContents(trandata, null);
2.获取剪切板中的内容(文本数据)
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable clipT = clipboard.getContents(null); //获取文本中的Transferable对象
if(clipT!=null){
if(clipT.isDataFlavorSupported(DataFlavor.stringFlavor)) //判断内容是否为文本类型stringFlavor
return (String)clipT.getTransferData(DataFlavor.stringFlavor); //返回指定flavor类型的数据
1. import java.awt.*;
2. import java.awt.datatransfer.*;
3. import java.io.*;
4.
5. public class Test{
6. public static void main(String [] args){
7. String s="abc";
8. setClipboard(s);
9. System.out.println (getClipboard());
10.
11. }
12. // If a string is on the system clipboard, this method returns it;
13. // otherwise it returns null.
14. public static String getClipboard() {
15. Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
16.
17. try {
18. if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
19. String text = (String)t.getTransferData(DataFlavor.stringFlavor);
20. return text;
21. }
22. } catch (UnsupportedFlavorException e) {
23. } catch (IOException e) {
24. }
25. return null;
26. }
27.
28. // This method writes a string to the system clipboard.
29. // otherwise it returns null.
30. public static void setClipboard(String str) {
31. StringSelection ss = new StringSelection(str);
32. Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
33. }
34.
35.
36.
37. //deal with image
38. //Getting and Setting an Image on the System Clipboard
39. // If an image is on the system clipboard, this method returns it;
40. // otherwise it returns null.
41. public static Image getImageClipboard() {
42. Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
43.
44. try {
45. if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
46. Image image = (Image)t.getTransferData(DataFlavor.imageFlavor);
47. return image;
48. }
49. } catch (UnsupportedFlavorException e) {
50. } catch (IOException e) {
51. }
52. return null;
53. }
54.
55. //Setting an image on the system clipboard requires a custom Transferable object to hold the image while on the clipboard.
56. // This method writes a image to the system clipboard.
57. // otherwise it returns null.
58. public static void setImageClipboard(Image image) {
59. ImageSelection imgSel = new ImageSelection(image);
60. Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null);
61. }
62.
63. // This class is used to hold an image while on the clipboard.
64. public static class ImageSelection implements Transferable {
65. private Image image;
66.
67. public ImageSelection(Image image) {
68. this.image = image;
69. }
70.
71. // Returns supported flavors
72. public DataFlavor[] getTransferDataFlavors() {
73. return new DataFlavor[]{DataFlavor.imageFlavor};
74. }
75.
76. // Returns true if flavor is supported
77. public boolean isDataFlavorSupported(DataFlavor flavor) {
78. return DataFlavor.imageFlavor.equals(flavor);
79. }
80.
81. // Returns image
82. public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
83. if (!DataFlavor.imageFlavor.equals(flavor)) {
84. throw new UnsupportedFlavorException(flavor);
85. }
86. return image;
87. }
88. }
89. }
- 这段代码主要描述了以文字和图片两种形式读写剪贴板操作。