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實例作為參數傳入即可。
/*
* 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;
}
}