本文实例讲述了Java利用剪贴板交换程序间数据的实现方法。在图形化系统中,系统剪贴板非常重要,很难想象一个没有剪贴板功能的图形化操作系统使用起来会是怎样。本例就实现了Java 程序与所在系统的剪贴板的数据交流,当单击“Paste”按钮后,Java 程序从系统剪贴板中取得数据并显示在一个JTextArea 组件中;当单击“Copy”按钮后,文本区中的选中文本将被传送到系统剪贴板上。
首先必须得到系统剪贴板的实例引用,java.awt.Toolkit 类中提供了getSystemClipboard()方法来返回一个Clipboard 实例;并且由于Toolkit 类提供了静态方法getDefaultToolkit()返回一个Toolkit实例,因此也不必new 一个Toolkit 对象,具体实现代码如下:
1
|
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); |
此处Clipboard 类提供了getContents()和setContents()方法来实现数据交换。
1
2
|
Transferable getContents(Object requester); Void setContents(Transferable contents, ClipboardOwner owner); |
此处的getContents()方法从系统剪贴板中获得一个Transferable 对象,参数requester 表示数据申请者,一般用this 就行了,表示要求数据的是本类的实例对象。如果要求的数据是文本,可以调用Transferable对象的getTransferData(DataFlavor.stringFlavor)得到,实现代码如下:
1
2
|
Transferable tr = cb.getContents( this ); String s = (String) tr.getTransferData(DataFlavor.stringFlavor); |
setContents()方法从程序中传数据到系统剪贴板,参数contents 表示数据,参数owner 表示剪贴板的拥有者。
1
2
|
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。具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
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(),完成各组件的初始属性设置,并为按钮组件添加事件监听器,具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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”按钮的事件处理方法,向系统剪贴板发送数据。
1
2
3
4
|
void jButton1_actionPerformed(ActionEvent e) { StringSelection ss = new StringSelection( this .jTextArea1.getText()); //发送选中文本到系统剪贴板 cb.setContents(ss,ss); } |
6.编写“Paste”按钮的事件处理方法,从系统剪贴板获得数据。
1
2
3
4
5
6
7
8
9
10
11
12
|
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(); } } |