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

六月 1, 2010 | 标签 | 浏览
评论 0
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);
} 

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;
} 

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);
}

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;
} 

顺便付上简单的小例子,直接就可以运行的

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


    相关文章:



发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。