关于java.awt.datatransfer.Clipboard的复制图片等等

关于java.awt.datatransfer.Clipboard的复制图片等等

关键字: clipboard
昨天转了一篇关于 Robot 实现屏幕抓图 的程序,之后想加上图片复制等等的功能。
尝试了一下,剪贴板的话 应该是下面这个:
java.awt.datatransfer.Clipboard clipboard=java.awt.Toolkit.getDefaultToolkit().getSystemClipboard(); //获得系统剪切板

以前用的时候都是用复制文字等String的,没有复制过图片Image。
查了查 ,总结如下。

Java中使用java.awt.datatransfer.Clipboard类来描述剪切板,
系统剪切板通过Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();

写内容到剪贴板或者是从剪贴板读取内容的话,几个常用的方法用于读写剪切板中的文本数据以及图像数据

1. 往剪切板写文本数据(就是常说的String拉)

Java代码 复制代码
  1. protected static void setClipboardText(Clipboard clip, String writeMe) {   
  2.    Transferable tText = new StringSelection(writeMe);   
  3.    clip.setContents(tText, null);   
  4. }   
 


2. 从指定的剪切板中获取文本内容

Java代码 复制代码
  1. protected static String getClipboardText(Clipboard clip) throws Exception{   
  2.    // 获取剪切板中的内容   
  3.    Transferable clipT = clip.getContents(null);   
  4.    if (clipT != null) {   
  5.     // 检查内容是否是文本类型   
  6.     if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))   
  7.      return (String)clipT.getTransferData(DataFlavor.stringFlavor);   
  8.    }   
  9.    return null;   
  10. }   
 

3. 写图像到剪切板

Java代码 复制代码
  1. protected static void setClipboardImage(final Image image) {   
  2.    Transferable trans = new Transferable(){   
  3.     public DataFlavor[] getTransferDataFlavors() {   
  4.      return new DataFlavor[] { DataFlavor.imageFlavor };   
  5.     }   
  6.     public boolean isDataFlavorSupported(DataFlavor flavor) {   
  7.      return DataFlavor.imageFlavor.equals(flavor);   
  8.     }   
  9.     public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {   
  10.      if(isDataFlavorSupported(flavor))   
  11.       return image;   
  12.      throw new UnsupportedFlavorException(flavor);   
  13.     }   
  14.   
  15.    };   
  16.    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);   
  17. }  
 

4. 从剪切板读取图像

Java代码 复制代码
  1. public static Image getImageFromClipboard() throws Exception{   
  2.    Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();   
  3.    Transferable cc = sysc.getContents(null);   
  4.    if (cc == null)   
  5.     return null;   
  6.    else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor))   
  7.     return (Image)cc.getTransferData(DataFlavor.imageFlavor);   
  8.    return null;   
  9. }   

顺便付上简单的小例子,直接就可以运行的
Java代码 复制代码
  1. package com.testCutAndPaste;   
  2.   
  3. import java.awt.datatransfer.Clipboard;   
  4. import java.awt.datatransfer.DataFlavor;   
  5. import java.awt.datatransfer.StringSelection;   
  6. import java.awt.datatransfer.Transferable;   
  7. import java.awt.event.ActionEvent;   
  8. import java.awt.event.ActionListener;   
  9.   
  10. import javax.swing.JFrame;   
  11. import javax.swing.JMenu;   
  12. import javax.swing.JMenuBar;   
  13. import javax.swing.JMenuItem;   
  14. import javax.swing.JTextArea;   
  15.   
  16. public class CutAndPaste extends JFrame {   
  17.     private JMenuBar mb = new JMenuBar();   
  18.   
  19.     private JMenu edit = new JMenu("Edit");   
  20.   
  21.     private JMenuItem cut = new JMenuItem("Cut"),    
  22.                        copy = new JMenuItem("Copy"),   
  23.                        paste = new JMenuItem("Paste");   
  24.   
  25.     private JTextArea text = new JTextArea(2020);   
  26.   
  27.     private Clipboard clipbd = getToolkit().getSystemClipboard();   
  28.   
  29.     public CutAndPaste() {   
  30.         cut.addActionListener(new CutL());   
  31.         copy.addActionListener(new CopyL());   
  32.         paste.addActionListener(new PasteL());   
  33.         edit.add(cut);   
  34.         edit.add(copy);   
  35.         edit.add(paste);   
  36.         mb.add(edit);   
  37.         setJMenuBar(mb);   
  38.         getContentPane().add(text);   
  39.     }   
  40.   
  41.     class CopyL implements ActionListener {   
  42.         public void actionPerformed(ActionEvent e) {   
  43.             String selection = text.getSelectedText();   
  44.             if (selection == null)   
  45.                 return;   
  46.             StringSelection clipString = new StringSelection(selection);   
  47.             clipbd.setContents(clipString, clipString);   
  48.         }   
  49.     }   
  50.   
  51.     class CutL implements ActionListener {   
  52.         public void actionPerformed(ActionEvent e) {   
  53.             String selection = text.getSelectedText();   
  54.             if (selection == null)   
  55.                 return;   
  56.             StringSelection clipString = new StringSelection(selection);   
  57.             clipbd.setContents(clipString, clipString);   
  58.             text.replaceRange("", text.getSelectionStart(), text   
  59.                     .getSelectionEnd());   
  60.         }   
  61.     }   
  62.   
  63.     class PasteL implements ActionListener {   
  64.         public void actionPerformed(ActionEvent e) {   
  65.             Transferable clipData = clipbd.getContents(CutAndPaste.this);   
  66.             try {   
  67.                 String clipString = (String) clipData   
  68.                         .getTransferData(DataFlavor.stringFlavor);   
  69.                 text.replaceRange(clipString, text.getSelectionStart(), text   
  70.                         .getSelectionEnd());   
  71.             } catch (Exception ex) {   
  72.                 System.err.println("Not String flavor");   
  73.             }   
  74.         }   
  75.     }   
  76.   
  77.     public static void main(String[] args) {   
  78.         run(new CutAndPaste(), 300200);   
  79.     }   
  80.   
  81.     public static void run(JFrame frame, int width, int height) {   
  82.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  83.         frame.setSize(width, height);   
  84.         frame.setVisible(true);   
  85.     }   
  86. }  
 

通过API介绍,貌似还可以复制其他玩意,大家可以试试,先把资料贴出来。
字段摘要
static DataFlavor imageFlavor
          DataFlavor 表示 Java Image 类,其中: representationClass = java.awt.Image mimeType = "image/x-java-image"
static DataFlavor javaFileListFlavor
          要将文件列表传入 Java(及基础平台)或从中传出,需要使用此类型/子类型的 DataFlavorjava.util.List 的表示形式类。
static String javaJVMLocalObjectMimeType
          要将一个引用转换为不具有关联 MIME Content 类型的任意 Java 对象引用(跨越 Transferable 接口 WITHIN THE SAME JVM),需要使用具有此类型/子类型的 DataFlavor ,其中 representationClass 等于跨越 Transferable 传递的类/接口的类型。
static String javaRemoteObjectMimeType
          为了通过拖放 ACTION_LINK 操作将活动链接传递到 Remote 对象,应该使用 Mime Content 类型的 application/x-java-remote-object,其中 DataFlavor 的表示形式类表示要传输的 Remote 接口的类型。
static String javaSerializedObjectMimeType
          MIME Content 类型的 application/x-java-serialized-object 表示已变得持久的 Java 对象的图形。
static DataFlavor plainTextFlavor
          已过时。  从 1.3 开始。使用 DataFlavor.getReaderForText(Transferable) 代替 Transferable.getTransferData(DataFlavor.plainTextFlavor)
static DataFlavor stringFlavor
          DataFlavor 表示 Java Unicode String 类,其中: representationClass = java.lang.String mimeType = "application/x-java-serialized-object"

DataFlavor flavor=java.awt.datatransfer.DataFlavor.stringFlavor//在数据拖放期间,或在文件系统中,当每个实例显示在剪切板上时,它代表了数据格式的不透明概念.其实就是在系统内存中的东西是哪种类型.比如:文本,图片等.就象网页中的 contentType="text/html"等一样.这里的stringFlavor是字符类型.
if(transferable.isDataFlavorSupported(flavor))//如果是XX类型.这里是把flavor传递进去.
这里判断就是说:如果是文本类型.那么我们才取得:
可以这么取得:str=(String)transferable.getTransferData(flavor);
这样把剪切板的东西get出来.才强制成String 型不会出错.
其他的类型也是这么判断然后读取。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值