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 = newStringSelection(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 voidsetImageClipboard(Image image) {

ImageSelection imgSel= newImageSelection(image);

Toolkit.getDefaultToolkit().getSystemClipboard().setContents(imgSel,null);

}public static class ImageSelection implementsTransferable {privateImage image;public ImageSelection(Image image) {this.image =image;}publicDataFlavor[] getTransferDataFlavors() {return newDataFlavor[]{DataFlavor.imageFlavor};

}public booleanisDataFlavorSupported(DataFlavor flavor) {returnDataFlavor.imageFlavor.equals(flavor);

}public Object getTransferData(DataFlavor flavor) throwsUnsupportedFlavorException, IOException {if (!DataFlavor.imageFlavor.equals(flavor)) {throw newUnsupportedFlavorException(flavor);}returnimage;

}

}

2.2.2 获取

public staticImage getImageClipboard() {

Transferable t= Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);try{if (null != t &&t.isDataFlavorSupported(DataFlavor.imageFlavor)) {

Image image=(Image)t.getTransferData(DataFlavor.imageFlavor);returnimage;

}

}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 implementsTransferable, ClipboardOwner {public static final DataFlavor rangeFlavor = new DataFlavor(RangeDataModel.class, "Report Range");//class为自定义的java类 字串随便

private static final DataFlavor[] flavors ={ rangeFlavor };privateObject data;publicTestSelection(Object data) {this.data =data;

}

@Overridepublic Object getTransferData(DataFlavor flavor) throwsUnsupportedFlavorException, IOException {if(flavor.equals(flavors[RANGE])) {returndata;

}else{throw newUnsupportedFlavorException(flavor);

}

}

@OverridepublicDataFlavor[] getTransferDataFlavors() {return(DataFlavor[]) flavors.clone();

}

@Overridepublic booleanisDataFlavorSupported(DataFlavor flavor) {for (int i = 0; i < flavors.length; i++) {if(flavor.equals(flavors[i])) {return true;

}

}return false;

}

@Overridepublic voidlostOwnership(Clipboard clipboard, Transferable contents) {//TODO Auto-generated method stub

}

}

2.3.2 设置

//创建自定义剪切板对象

Clipboard clipboard = new Clipboard("clipboardName");//构建数据对象 data为数据类型java类的对象

ReportSelection content = newReportSelection(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= newClipboardContent();

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. 参考

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值