关于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拉)
- protected static void setClipboardText(Clipboard clip, String writeMe) {
- Transferable tText = new StringSelection(writeMe);
- clip.setContents(tText, null);
- }
protected static void setClipboardText(Clipboard clip, String writeMe) { Transferable tText = new StringSelection(writeMe); clip.setContents(tText, null); }
2. 从指定的剪切板中获取文本内容
- protected static String getClipboardText(Clipboard clip) throws Exception{
- // 获取剪切板中的内容
- Transferable clipT = clip.getContents(null);
- if (clipT != null) {
- // 检查内容是否是文本类型
- if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor))
- return (String)clipT.getTransferData(DataFlavor.stringFlavor);
- }
- return null;
- }
protected static String getClipboardText(Clipboard clip) throws Exception{ // 获取剪切板中的内容 Transferable clipT = clip.getContents(null); if (clipT != null) { // 检查内容是否是文本类型 if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor)) return (String)clipT.getTransferData(DataFlavor.stringFlavor); } return null; }
3. 写图像到剪切板
- protected static void setClipboardImage(final Image image) {
- Transferable trans = new Transferable(){
- 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(isDataFlavorSupported(flavor))
- return image;
- throw new UnsupportedFlavorException(flavor);
- }
- };
- Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);
- }
protected static void setClipboardImage(final Image image) { Transferable trans = new Transferable(){ 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(isDataFlavorSupported(flavor)) return image; throw new UnsupportedFlavorException(flavor); } }; Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null); }
4. 从剪切板读取图像
- public static Image getImageFromClipboard() throws Exception{
- Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard();
- Transferable cc = sysc.getContents(null);
- if (cc == null)
- return null;
- else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor))
- return (Image)cc.getTransferData(DataFlavor.imageFlavor);
- return null;
- }
public static Image getImageFromClipboard() throws Exception{ Clipboard sysc = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable cc = sysc.getContents(null); if (cc == null) return null; else if(cc.isDataFlavorSupported(DataFlavor.imageFlavor)) return (Image)cc.getTransferData(DataFlavor.imageFlavor); return null; }
顺便付上简单的小例子,直接就可以运行的
- package com.testCutAndPaste;
- import java.awt.datatransfer.Clipboard;
- import java.awt.datatransfer.DataFlavor;
- import java.awt.datatransfer.StringSelection;
- import java.awt.datatransfer.Transferable;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import javax.swing.JFrame;
- import javax.swing.JMenu;
- import javax.swing.JMenuBar;
- import javax.swing.JMenuItem;
- import javax.swing.JTextArea;
- public class CutAndPaste extends JFrame {
- private JMenuBar mb = new JMenuBar();
- private JMenu edit = new JMenu("Edit");
- private JMenuItem cut = new JMenuItem("Cut"),
- copy = new JMenuItem("Copy"),
- paste = new JMenuItem("Paste");
- private JTextArea text = new JTextArea(20, 20);
- private Clipboard clipbd = getToolkit().getSystemClipboard();
- public CutAndPaste() {
- cut.addActionListener(new CutL());
- copy.addActionListener(new CopyL());
- paste.addActionListener(new PasteL());
- edit.add(cut);
- edit.add(copy);
- edit.add(paste);
- mb.add(edit);
- setJMenuBar(mb);
- getContentPane().add(text);
- }
- class CopyL implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- String selection = text.getSelectedText();
- if (selection == null)
- return;
- StringSelection clipString = new StringSelection(selection);
- clipbd.setContents(clipString, clipString);
- }
- }
- class CutL implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- String selection = text.getSelectedText();
- if (selection == null)
- return;
- StringSelection clipString = new StringSelection(selection);
- clipbd.setContents(clipString, clipString);
- text.replaceRange("", text.getSelectionStart(), text
- .getSelectionEnd());
- }
- }
- class PasteL implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- Transferable clipData = clipbd.getContents(CutAndPaste.this);
- try {
- String clipString = (String) clipData
- .getTransferData(DataFlavor.stringFlavor);
- text.replaceRange(clipString, text.getSelectionStart(), text
- .getSelectionEnd());
- } catch (Exception ex) {
- System.err.println("Not String flavor");
- }
- }
- }
- public static void main(String[] args) {
- run(new CutAndPaste(), 300, 200);
- }
- public static void run(JFrame frame, int width, int height) {
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setSize(width, height);
- frame.setVisible(true);
- }
- }
package com.testCutAndPaste; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JTextArea; public class CutAndPaste extends JFrame { private JMenuBar mb = new JMenuBar(); private JMenu edit = new JMenu("Edit"); private JMenuItem cut = new JMenuItem("Cut"), copy = new JMenuItem("Copy"), paste = new JMenuItem("Paste"); private JTextArea text = new JTextArea(20, 20); private Clipboard clipbd = getToolkit().getSystemClipboard(); public CutAndPaste() { cut.addActionListener(new CutL()); copy.addActionListener(new CopyL()); paste.addActionListener(new PasteL()); edit.add(cut); edit.add(copy); edit.add(paste); mb.add(edit); setJMenuBar(mb); getContentPane().add(text); } class CopyL implements ActionListener { public void actionPerformed(ActionEvent e) { String selection = text.getSelectedText(); if (selection == null) return; StringSelection clipString = new StringSelection(selection); clipbd.setContents(clipString, clipString); } } class CutL implements ActionListener { public void actionPerformed(ActionEvent e) { String selection = text.getSelectedText(); if (selection == null) return; StringSelection clipString = new StringSelection(selection); clipbd.setContents(clipString, clipString); text.replaceRange("", text.getSelectionStart(), text .getSelectionEnd()); } } class PasteL implements ActionListener { public void actionPerformed(ActionEvent e) { Transferable clipData = clipbd.getContents(CutAndPaste.this); try { String clipString = (String) clipData .getTransferData(DataFlavor.stringFlavor); text.replaceRange(clipString, text.getSelectionStart(), text .getSelectionEnd()); } catch (Exception ex) { System.err.println("Not String flavor"); } } } public static void main(String[] args) { run(new CutAndPaste(), 300, 200); } public static void run(JFrame frame, int width, int height) { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(width, height); frame.setVisible(true); } }
通过API介绍,貌似还可以复制其他玩意,大家可以试试,先把资料贴出来。
字段摘要 | |
---|---|
static DataFlavor | imageFlavor DataFlavor 表示 Java Image 类,其中: representationClass = java.awt.Image mimeType = "image/x-java-image" |
static DataFlavor | javaFileListFlavor 要将文件列表传入 Java(及基础平台)或从中传出,需要使用此类型/子类型的 DataFlavor 和 java.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 型不会出错.
可以这么取得:str=(String)transferable.getTransferData(flavor);
这样把剪切板的东西get出来.才强制成String 型不会出错.
其他的类型也是这么判断然后读取。