Java利用剪贴板实现交换程序间数据的方法
本文实例讲述了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(); } }
上一篇: python万年历实现代码 含运行结果