当前位置: 移动技术网 > IT编程>开发语言>Java > Java利用剪贴板实现交换程序间数据的方法

Java利用剪贴板实现交换程序间数据的方法

2019年07月22日  | 移动技术网IT编程  | 我要评论

图艾尔,王华佗,刘士余澄清传言

本文实例讲述了java利用剪贴板交换程序间数据的实现方法。在图形化系统中,系统剪贴板非常重要,很难想象一个没有剪贴板功能的图形化操作系统使用起来会是怎样。本例就实现了java 程序与所在系统的剪贴板的数据交流,当单击“paste”按钮后,java 程序从系统剪贴板中取得数据并显示在一个jtextarea 组件中;当单击“copy”按钮后,文本区中的选中文本将被传送到系统剪贴板上。

首先必须得到系统剪贴板的实例引用,java.awt.toolkit 类中提供了getsystemclipboard()方法来返回一个clipboard 实例;并且由于toolkit 类提供了静态方法getdefaulttoolkit()返回一个toolkit实例,因此也不必new 一个toolkit 对象,具体实现代码如下:

clipboard cb = toolkit.getdefaulttoolkit().getsystemclipboard();

此处clipboard 类提供了getcontents()和setcontents()方法来实现数据交换。

transferable getcontents(object requester);
void setcontents(transferable contents, clipboardowner owner);

此处的getcontents()方法从系统剪贴板中获得一个transferable 对象,参数requester 表示数据申请者,一般用this 就行了,表示要求数据的是本类的实例对象。如果要求的数据是文本,可以调用transferable对象的gettransferdata(dataflavor.stringflavor)得到,实现代码如下:

transferable tr = cb.getcontents(this);
string s = (string) tr.gettransferdata(dataflavor.stringflavor);

setcontents()方法从程序中传数据到系统剪贴板,参数contents 表示数据,参数owner 表示剪贴板的拥有者。

stringselection ss = new stringselection(this.jtextarea1.gettext());
cb.setcontents(ss,ss);

上面语句中的stringselection 类表示选中的文本。
从上面的分析,实际上系统剪贴板中存放的是transferable对象集合,程序和系统剪贴板的数据交换就是transferable 对象的传递。程序代码:

1.新建一个project,取名为jclipdemo。
2.新建一个application,取名为jclipdemo;主窗口名取名为mainframe,标题为jclipdemo。
3.在mainframe 类的设计窗口中添加一个jtextarea 组件、两个jbutton 和一个jpanel 组件,并且两个jbutton 组件放在jpanel 组件上。添加新的属性clipboard cb。具体代码如下:

public class mainframe extends jframe {
private jpanel contentpane;
private borderlayout borderlayout1 = new borderlayout();
//创建新的组件
private jtextarea jtextarea1 = new jtextarea();
private jpanel jpanel1 = new jpanel();
private jbutton jbutton1 = new jbutton();
private jbutton jbutton2 = new jbutton();
//剪贴板实例
clipboard cb = toolkit.getdefaulttoolkit().getsystemclipboard();
……
}

4.编写mainframe 类的初始化方法jbinit(),完成各组件的初始属性设置,并为按钮组件添加事件监听器,具体代码如下:

private void jbinit() throws exception {
//seticonimage(toolkit.getdefaulttoolkit().createimage(mainframe.class.getresource("[your icon]")));
contentpane = (jpanel) this.getcontentpane();
contentpane.setlayout(borderlayout1);
this.setsize(new dimension(396, 203));
this.settitle("jclipboarddemo");
jbutton1.setfont(new java.awt.font("dialog", 0, 14));
jbutton1.settext("copy");
jbutton1.addactionlistener(new java.awt.event.actionlistener() { //添加事件监听器
public void actionperformed(actionevent e) {
jbutton1_actionperformed(e);
}
});
jbutton2.setfont(new java.awt.font("dialog", 0, 14));
jbutton2.settext("paste");
jbutton2.addactionlistener(new java.awt.event.actionlistener() {//添加事件监听器
public void actionperformed(actionevent e) {
jbutton2_actionperformed(e);
}
});
contentpane.add(jtextarea1, borderlayout.center);
contentpane.add(jpanel1, borderlayout.south);
jpanel1.add(jbutton1, null);
jpanel1.add(jbutton2, null);
}

5.编写“copy”按钮的事件处理方法,向系统剪贴板发送数据。

void jbutton1_actionperformed(actionevent e) {
stringselection ss = new stringselection(this.jtextarea1.gettext()); //发送选中文本到系统剪贴板
cb.setcontents(ss,ss);
}

6.编写“paste”按钮的事件处理方法,从系统剪贴板获得数据。

void jbutton2_actionperformed(actionevent e) {
try{
transferable tr = cb.getcontents(this); //从系统剪贴板得到一个transferable 对象
if (tr != null){
string s = (string) tr.gettransferdata(dataflavor.stringflavor); //从transferable 对象中得到文本数据
if (s!=null)
this.jtextarea1.insert(s,this.jtextarea1.getcaretposition()); //在jtextarea 组件中的光标所在处插入文本
}
}catch(exception err){
err.printstacktrace();
}
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网