Java提供兩種類型的剪貼板:系統的和本地的.
(1)本地剪貼板只在當前虛擬機中有效.Java允許多個本地剪貼板同時存在,可以方便地通過剪貼板的名稱來進行存取訪問.
(2)系統剪貼板與同等操作系統直接關連,允許應用程序與運行在該操作系統下的其它程序之間進行信息交換.
下邊爲java對於系統粘貼板可以進行的操作,對文本和圖片的複製以及粘貼(對圖片用的是File,當然也可以手動繪製Image對象只需要修改部分方法即可)
package clipboard;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
public class ClipboardTest {
/**
* 將字符串賦值到系統粘貼板
* @param data 要複製的字符串
*/
public void setClipboardString(String data) {
// 獲取系統剪貼板
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
// 封裝data內容
Transferable ts = new StringSelection(data);
// 把文本內容設置到系統剪貼板
clipboard.setContents(ts, null);
}
/**
* 得到系統粘貼板上的String對象
* @return 內容
*/
public String getClipboardString() {
//獲取系統粘貼板
//Toolkit類:Abstract Window Toolkit的所有實際實現的抽象超類。 Toolkit類的子類用於將各種組件綁定到特定的本機Toolkit實現。
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//獲取封裝好的data數據
Transferable ts = clipboard.getContents(null);
if (ts != null) {
// 判斷剪貼板中的內容是否支持文本
if (ts.isDataFlavorSupported(DataFlavor.stringFlavor)) {
try {
// 獲取剪貼板中的文本內容
String data = (String) ts.getTransferData(DataFlavor.stringFlavor);
return data;
} catch (Exception e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 複製圖像到系統粘貼板 (實際上我們不用手繪Image對象直接用File對象得到)
* @param path 圖片的地址
*/
private void copyImage(String path){
//將path得到的file轉換成image
Image image = null;
File file = new File(path);
BufferedImage bi;
//通過io流操作把file對象轉換成Image
try {
InputStream is=new FileInputStream(file);
bi = ImageIO.read(is);
image=(Image)bi;
} catch (IOException e) {
e.printStackTrace();
}
//複製到粘貼板上
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); //得到系統剪貼板
Transferable selection = new ImageSelection(image); //圖像通道
clipboard.setContents(selection, null);
}
/**
* 得到系統粘貼板上的圖片複製到我們項目路徑下;
* @return 目標Image對象
*/
public Image getImage() {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable ts = clipboard.getContents(null);
if(ts==null) return null;
Image image = null;
if(ts.isDataFlavorSupported(DataFlavor.imageFlavor)) {//這是判斷是否支持粘貼圖片
try {
image = (Image)ts.getTransferData(DataFlavor.imageFlavor);
System.out.println("可以轉換");
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
}
//通過我們得到的image轉換成BufferedImage對象來寫出數據
BufferedImage bi = (BufferedImage) image;
bufferedImageToOutputStream(bi);
return image;
}
/**
* 通過file和BufferedImage 得到一個OutputStream對象來講數據寫入定義好的file對象
* @param bufferedimage 我們從image轉換來的
* @param file 圖片.png
*/
public void bufferedImageToOutputStream(BufferedImage bufferedimage){
File file = new File("圖片.png");
if(file.exists()) file.delete();
try {
FileOutputStream os = new FileOutputStream(file);
ImageIO.write(bufferedimage, "png", os);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ClipboardTest ct = new ClipboardTest();
// ct.setClipboardString("666");
// System.out.println(ct.getClipboardString());
ct.copyImage("C:\\Users\\Administrator\\Desktop\\數據結構\\廣義表.png");
ct.getImage(); //我們接收沒用,就看file的效果就可以了
// System.out.println(System.getProperty("java.class.path"));
}
}
對於其中涉及到的類的大概作用:
Clipboard類: 此類實現一種使用剪切/複製/粘貼操作傳輸數據的機制. ClipboardOwner接口: 任何處理剪貼板的類都必須實現該接口.該接口用於剪貼板中的原始數據被替換時發出通知. Dataflavor類:
提供有關數據的元信息,通常用於訪問剪切板上的數據。 Transferable接口: 爲傳輸操作提供數據所使用的類的接口
StringSelection類: 實現傳輸String所需能力的Transferable
以及我們用到的方法功能的大概描述:
.setContents(Transferable contents,ClipOwner owner):將剪切板的內容設置到指定的Transferable對象,並將指定的剪切板所有者作爲新內容的所有者註冊
Transferable getContents(null):返回表示剪貼板當前內容的 transferable 對象。無則null
boolean isDataFlavorAvailable(DataFlavor flavor):返回是否能夠以指定的 DataFlavor 形式提供此剪貼板的當前內容。
Transferable接口:
屬性:
stringFlavor:字符串數據
imageFlavor:圖片數據