java對於粘貼板的操作(複製和粘貼),系統粘貼板(包含圖片和文本)

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:圖片數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章