1. 概述
提起剪切板,一般都是在桌面系統或工具中使用。目前,操作Java剪切板有兩種形式,這也對應着兩種不同的技術Swing和JavaFX。
而剪切板有可以分為系統剪切板和自定義剪切板。顧名思義,系統剪切板可以在操作系統的范圍內通用,一般支持String文本類型和Image圖像類型。而自定義剪切板主要用於Java桌面應用程序內部的數據轉移。
2. Swing的操作方式
2.1 String文本類型
2.1.1 設置
//獲取系統剪切板 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); //設置字符串 String str = "測試設置String到剪切板"; //構建String數據類型 StringSelection selection = new StringSelection(str); //添加文本到系統剪切板 clipboard.setContents(selection, null);
2.1.2 獲取
Transferable content = clipboard.getContents(null);//從系統剪切板中獲取數據 if (content.isDataFlavorSupported(DataFlavor.stringFlavor)) {//判斷是否為文本類型 String text = (String) content.getTransferData(DataFlavor.stringFlavor);//從數據中獲取文本值 if (text == null) { return; } System.out.println(text); }
2.2 Image圖像類型
2.2.1 設置
public static void setImageClipboard(Image image) { ImageSelection imgSel = new ImageSelection(image); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel, null); } public static class ImageSelection implements Transferable { private Image image; public ImageSelection(Image image) {this.image = image;} 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 (!DataFlavor.imageFlavor.equals(flavor)) {throw new UnsupportedFlavorException(flavor);} return image; } }
2.2.2 獲取
public static Image getImageClipboard() { Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null); try { if (null != t && t.isDataFlavorSupported(DataFlavor.imageFlavor)) { Image image = (Image)t.getTransferData(DataFlavor.imageFlavor); return image; } } catch (UnsupportedFlavorException e) { //System.out.println("Error tip: "+e.getMessage()); } catch (IOException e) { //System.out.println("Error tip: "+e.getMessage()); } return null; }
2.3 自定義剪切板
2.3.1 首先需要寫一個數據類
public class TestSelection implements Transferable, ClipboardOwner { public static final DataFlavor rangeFlavor = new DataFlavor(RangeDataModel.class, "Report Range");//class為自定義的java類 字串隨便 private static final DataFlavor[] flavors = { rangeFlavor }; private Object data; public TestSelection(Object data) { this.data = data; } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (flavor.equals(flavors[RANGE])) { return data; } else { throw new UnsupportedFlavorException(flavor); } } @Override public DataFlavor[] getTransferDataFlavors() { return (DataFlavor[]) flavors.clone(); } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { for (int i = 0; i < flavors.length; i++) { if (flavor.equals(flavors[i])) { return true; } } return false; } @Override public void lostOwnership(Clipboard clipboard, Transferable contents) { // TODO Auto-generated method stub } }
2.3.2 設置
//創建自定義剪切板對象 Clipboard clipboard = new Clipboard("clipboardName"); //構建數據對象 data為數據類型java類的對象 ReportSelection content = new ReportSelection(data); clipboard.setContents(content, null);
2.3.3 獲取
//注意:自定義剪切板必須給null參數 Transferable content = clipboard.getContents(null); if (content.isDataFlavorSupported(ReportSelection.rangeFlavor)) { RangeDataModel data = (RangeDataModel) content.getTransferData(ReportSelection.rangeFlavor); System.out.println(data); }
3. JavaFX的操作方式
3.1 設置
Clipboard clipboard = Clipboard.getSystemClipboard(); ClipboardContent cc = new ClipboardContent(); cc.putString("測試使用JavaFX向系統剪切板放置數據"); clipboard.setContent(cc);
3.2 獲取
Clipboard clipboard = Clipboard.getSystemClipboard();
clipboard.getContent(DataFormat.PLAIN_TEXT);
至於JavaFX對其他類型的數據的剪切支持,DataFormat中定義了以下類型PLAIN_TEXT、HTML、RTF、URL、IMAGE、FILES,大家可以去嘗試
4. 注意
4.1 Swing操作方式的Clipboard類位於 java.awt.datatransfer包中,而JavaFX操作方式的Clipboard類位於javafx.scene.input包中。
4.2 如果你在你的Java桌面應用程序中同時使用了Swing和JavaFX技術,建議只使用一種剪切方法,且要保證在對應的事件線程上同步,否則可能會遇到剪切板鎖定無法訪問的問題。
5. 參考
本文參考了以下文章的內容
5.1 http://blog.csdn.net/shenzhennba/article/details/8213294
5.2 http://cuiweiqing1988.iteye.com/blog/947030
