Java剪切板操作大全

来源:互联网 发布:中国式过马路看法数据 编辑:程序博客网 时间:2024/05/29 16:30

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


http://www.alanzeng.cn/2015/10/java-clipboard/

0 0