zoukankan      html  css  js  c++  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. 参考

    本文参考了以下文章的内容

    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/

  • 相关阅读:
    TOMCAT添加管理用户认证
    NGINX配置详解及应用
    Zabbix部署
    NGINX+TOMCAT实现反向代理
    数据库-高级部分
    数据库-用户管理与pymysql
    数据库-表操作(CRUD)
    数据库-表关系练习
    数据库-表关系
    数据库-基础概念
  • 原文地址:https://www.cnblogs.com/xiaostudy/p/12909146.html
Copyright © 2011-2022 走看看