Java利用剪贴板实现交换程序间数据的方法
本文实例讲述了Java利用剪贴板交换程序间数据的实现方法。在图形化系统中,系统剪贴板非常重要,很难想象一个没有剪贴板功能的图形化操作系统使用起来会是怎样。本例就实现了Java程序与所在系统的剪贴板的数据交流,当单击“Paste”按钮后,Java程序从系统剪贴板中取得数据并显示在一个JTextArea组件中;当单击“Copy”按钮后,文本区中的选中文本将被传送到系统剪贴板上。
首先必须得到系统剪贴板的实例引用,java.awt.Toolkit类中提供了getSystemClipboard()方法来返回一个Clipboard实例;并且由于Toolkit类提供了静态方法getDefaultToolkit()返回一个Toolkit实例,因此也不必new一个Toolkit对象,具体实现代码如下:
Clipboardcb=Toolkit.getDefaultToolkit().getSystemClipboard();
此处Clipboard类提供了getContents()和setContents()方法来实现数据交换。
TransferablegetContents(Objectrequester); VoidsetContents(Transferablecontents,ClipboardOwnerowner);
此处的getContents()方法从系统剪贴板中获得一个Transferable对象,参数requester表示数据申请者,一般用this就行了,表示要求数据的是本类的实例对象。如果要求的数据是文本,可以调用Transferable对象的getTransferData(DataFlavor.stringFlavor)得到,实现代码如下:
Transferabletr=cb.getContents(this); Strings=(String)tr.getTransferData(DataFlavor.stringFlavor);
setContents()方法从程序中传数据到系统剪贴板,参数contents表示数据,参数owner表示剪贴板的拥有者。
StringSelectionss=newStringSelection(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组件上。添加新的属性Clipboardcb。具体代码如下:
publicclassMainFrameextendsJFrame{ privateJPanelcontentPane; privateBorderLayoutborderLayout1=newBorderLayout(); //创建新的组件 privateJTextAreajTextArea1=newJTextArea(); privateJPaneljPanel1=newJPanel(); privateJButtonjButton1=newJButton(); privateJButtonjButton2=newJButton(); //剪贴板实例 Clipboardcb=Toolkit.getDefaultToolkit().getSystemClipboard(); …… }
4.编写MainFrame类的初始化方法jbInit(),完成各组件的初始属性设置,并为按钮组件添加事件监听器,具体代码如下:
privatevoidjbInit()throwsException{ //setIconImage(Toolkit.getDefaultToolkit().createImage(MainFrame.class.getResource("[YourIcon]"))); contentPane=(JPanel)this.getContentPane(); contentPane.setLayout(borderLayout1); this.setSize(newDimension(396,203)); this.setTitle("JClipboardDemo"); jButton1.setFont(newjava.awt.Font("Dialog",0,14)); jButton1.setText("Copy"); jButton1.addActionListener(newjava.awt.event.ActionListener(){//添加事件监听器 publicvoidactionPerformed(ActionEvente){ jButton1_actionPerformed(e); } }); jButton2.setFont(newjava.awt.Font("Dialog",0,14)); jButton2.setText("Paste"); jButton2.addActionListener(newjava.awt.event.ActionListener(){//添加事件监听器 publicvoidactionPerformed(ActionEvente){ jButton2_actionPerformed(e); } }); contentPane.add(jTextArea1,BorderLayout.CENTER); contentPane.add(jPanel1,BorderLayout.SOUTH); jPanel1.add(jButton1,null); jPanel1.add(jButton2,null); }
5.编写“Copy”按钮的事件处理方法,向系统剪贴板发送数据。
voidjButton1_actionPerformed(ActionEvente){ StringSelectionss=newStringSelection(this.jTextArea1.getText());//发送选中文本到系统剪贴板 cb.setContents(ss,ss); }
6.编写“Paste”按钮的事件处理方法,从系统剪贴板获得数据。
voidjButton2_actionPerformed(ActionEvente){ try{ Transferabletr=cb.getContents(this);//从系统剪贴板得到一个Transferable对象 if(tr!=null){ Strings=(String)tr.getTransferData(DataFlavor.stringFlavor);//从Transferable对象中得到文本数据 if(s!=null) this.jTextArea1.insert(s,this.jTextArea1.getCaretPosition());//在JTextArea组件中的光标所在处插入文本 } }catch(Exceptionerr){ err.printStackTrace(); } }