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();
}
}