java对于粘贴板的操作(复制和粘贴),系统粘贴板(包含图片和文本)

Java提供两种类型的剪贴板:系统的和本地的.
(1)本地剪贴板只在当前虚拟机中有效.Java允许多个本地剪贴板同时存在,可以方便地通过剪贴板的名称来进行存取访问.
(2)系统剪贴板与同等操作系统直接关连,允许应用程序与运行在该操作系统下的其它程序之间进行信息交换.

下边为java对于系统粘贴板可以进行的操作,对文本和图片的复制以及粘贴(对图片用的是File,当然也可以手动绘制Image对象只需要修改部分方法即可)

package clipboard;

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.imageio.ImageIO;

public class ClipboardTest {

	/**
	 * 将字符串赋值到系统粘贴板
	 * @param data 要复制的字符串
	 */
	public void setClipboardString(String data) {
		// 获取系统剪贴板
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		// 封装data内容
		Transferable ts = new StringSelection(data);
		// 把文本内容设置到系统剪贴板
		clipboard.setContents(ts, null);
	}

	/**
	 * 得到系统粘贴板上的String对象
	 * @return  内容
	 */
	public String getClipboardString() {
		//获取系统粘贴板   
		//Toolkit类:Abstract Window Toolkit的所有实际实现的抽象超类。 Toolkit类的子类用于将各种组件绑定到特定的本机Toolkit实现。
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		//获取封装好的data数据
		Transferable ts = clipboard.getContents(null);
		if (ts != null) {
			// 判断剪贴板中的内容是否支持文本
			if (ts.isDataFlavorSupported(DataFlavor.stringFlavor)) {
				try {
					// 获取剪贴板中的文本内容
					String data = (String) ts.getTransferData(DataFlavor.stringFlavor);
					return data;
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
	/**
	 * 复制图像到系统粘贴板  (实际上我们不用手绘Image对象直接用File对象得到)
	 * @param path  图片的地址
	 */
	private void copyImage(String path){
		//将path得到的file转换成image
		Image image = null;
		File file = new File(path);
		BufferedImage bi;
		//通过io流操作把file对象转换成Image
		try {
			InputStream is=new FileInputStream(file);
			bi = ImageIO.read(is);
			image=(Image)bi;
		} catch (IOException e) {
			e.printStackTrace();
		}
		//复制到粘贴板上
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); //得到系统剪贴板
		Transferable selection = new ImageSelection(image);  //图像通道
		clipboard.setContents(selection, null);
	}
	/**
	 * 得到系统粘贴板上的图片复制到我们项目路径下;
	 * @return 目标Image对象
	 */
	public Image getImage() {
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		Transferable ts = clipboard.getContents(null);
		if(ts==null) return null;
		Image image = null;

		if(ts.isDataFlavorSupported(DataFlavor.imageFlavor)) {//这是判断是否支持粘贴图片
			try {
				image = (Image)ts.getTransferData(DataFlavor.imageFlavor);
				System.out.println("可以转换");
			} catch (UnsupportedFlavorException | IOException e) {
				e.printStackTrace();
			}
		}

		//通过我们得到的image转换成BufferedImage对象来写出数据
		BufferedImage bi = (BufferedImage) image;
		bufferedImageToOutputStream(bi);

		return image;
	}
	
	/**
	 * 通过file和BufferedImage 得到一个OutputStream对象来讲数据写入定义好的file对象
	 * @param bufferedimage 我们从image转换来的
	 * @param file 图片.png
	 */
	public void bufferedImageToOutputStream(BufferedImage bufferedimage){
		File file = new File("图片.png");
		if(file.exists()) file.delete();
		try {
			FileOutputStream os = new FileOutputStream(file);
			ImageIO.write(bufferedimage, "png", os);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		ClipboardTest ct = new ClipboardTest();
		//		ct.setClipboardString("666");
		//		System.out.println(ct.getClipboardString());
		ct.copyImage("C:\\Users\\Administrator\\Desktop\\数据结构\\广义表.png");
		ct.getImage(); //我们接收没用,就看file的效果就可以了
		//		System.out.println(System.getProperty("java.class.path"));
	}
}

对于其中涉及到的类的大概作用:

Clipboard类: 此类实现一种使用剪切/复制/粘贴操作传输数据的机制. ClipboardOwner接口: 任何处理剪贴板的类都必须实现该接口.该接口用于剪贴板中的原始数据被替换时发出通知. Dataflavor类:
提供有关数据的元信息,通常用于访问剪切板上的数据。 Transferable接口: 为传输操作提供数据所使用的类的接口
StringSelection类: 实现传输String所需能力的Transferable

以及我们用到的方法功能的大概描述:

.setContents(Transferable contents,ClipOwner owner):将剪切板的内容设置到指定的Transferable对象,并将指定的剪切板所有者作为新内容的所有者注册
Transferable getContents(null):返回表示剪贴板当前内容的 transferable 对象。无则null
boolean isDataFlavorAvailable(DataFlavor flavor):返回是否能够以指定的 DataFlavor 形式提供此剪贴板的当前内容。
Transferable接口:
属性:
stringFlavor:字符串数据
imageFlavor:图片数据

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是Java Swing中实现文本复制粘贴功能的示例代码: ```java import java.awt.*; import java.awt.datatransfer.*; import java.awt.event.*; import javax.swing.*; public class TextCopyPasteExample extends JFrame { private JTextArea textArea; private JPopupMenu popupMenu; private JMenuItem copyItem; private JMenuItem pasteItem; public TextCopyPasteExample() { // 创建文本区域 textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); getContentPane().add(scrollPane, BorderLayout.CENTER); // 创建弹出菜单 popupMenu = new JPopupMenu(); copyItem = new JMenuItem("复制"); pasteItem = new JMenuItem("粘贴"); popupMenu.add(copyItem); popupMenu.add(pasteItem); // 添加菜单项的事件监听器 copyItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { copyText(); } }); pasteItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pasteText(); } }); // 添加弹出菜单的触发器 textArea.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { showPopupMenu(e); } public void mouseReleased(MouseEvent e) { showPopupMenu(e); } }); // 设置窗口属性 setTitle("文本复制粘贴示例"); setSize(400, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } // 显示弹出菜单 private void showPopupMenu(MouseEvent e) { if (e.isPopupTrigger()) { popupMenu.show(e.getComponent(), e.getX(), e.getY()); } } // 复制文本到剪切板 private void copyText() { StringSelection selection = new StringSelection(textArea.getSelectedText()); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); clipboard.setContents(selection, null); } // 从剪切板粘贴文本 private void pasteText() { Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable contents = clipboard.getContents(null); if (contents != null && contents.isDataFlavorSupported(DataFlavor.stringFlavor)) { try { String text = (String) contents.getTransferData(DataFlavor.stringFlavor); textArea.replaceSelection(text); } catch (Exception ex) { ex.printStackTrace(); } } } public static void main(String[] args) { new TextCopyPasteExample(); } } ``` 该示例中创建了一个JFrame窗口,并在其中添加了一个JTextArea文本区域,通过添加鼠标事件监听器,在鼠标右键点击时弹出复制粘贴的弹出菜单。在复制粘贴的方法中,通过Java提供的Clipboard类和Transferable接口实现将文本复制到剪切板和从剪切板中粘贴文本的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰夫·王盖茨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值