1. 程式人生 > >Java剪下板操作大全

Java剪下板操作大全

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. 參考

本文參考了以下文章的內容