本文實(shí)例講述了Java利用剪貼板交換程序間數(shù)據(jù)的實(shí)現(xiàn)方法。在圖形化系統(tǒng)中,系統(tǒng)剪貼板非常重要,很難想象一個(gè)沒有剪貼板功能的圖形化操作系統(tǒng)使用起來會(huì)是怎樣。本例就實(shí)現(xiàn)了Java 程序與所在系統(tǒng)的剪貼板的數(shù)據(jù)交流,當(dāng)單擊“Paste”按鈕后,Java 程序從系統(tǒng)剪貼板中取得數(shù)據(jù)并顯示在一個(gè)JTextArea 組件中;當(dāng)單擊“Copy”按鈕后,文本區(qū)中的選中文本將被傳送到系統(tǒng)剪貼板上。
首先必須得到系統(tǒng)剪貼板的實(shí)例引用,java.awt.Toolkit 類中提供了getSystemClipboard()方法來返回一個(gè)Clipboard 實(shí)例;并且由于Toolkit 類提供了靜態(tài)方法getDefaultToolkit()返回一個(gè)Toolkit實(shí)例,因此也不必new 一個(gè)Toolkit 對(duì)象,具體實(shí)現(xiàn)代碼如下:
1
|
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); |
此處Clipboard 類提供了getContents()和setContents()方法來實(shí)現(xiàn)數(shù)據(jù)交換。
1
2
|
Transferable getContents(Object requester); Void setContents(Transferable contents, ClipboardOwner owner); |
此處的getContents()方法從系統(tǒng)剪貼板中獲得一個(gè)Transferable 對(duì)象,參數(shù)requester 表示數(shù)據(jù)申請(qǐng)者,一般用this 就行了,表示要求數(shù)據(jù)的是本類的實(shí)例對(duì)象。如果要求的數(shù)據(jù)是文本,可以調(diào)用Transferable對(duì)象的getTransferData(DataFlavor.stringFlavor)得到,實(shí)現(xiàn)代碼如下:
1
2
|
Transferable tr = cb.getContents( this ); String s = (String) tr.getTransferData(DataFlavor.stringFlavor); |
setContents()方法從程序中傳數(shù)據(jù)到系統(tǒng)剪貼板,參數(shù)contents 表示數(shù)據(jù),參數(shù)owner 表示剪貼板的擁有者。
1
2
|
StringSelection ss = new StringSelection( this .jTextArea1.getText()); cb.setContents(ss,ss); |
上面語句中的StringSelection 類表示選中的文本。
從上面的分析,實(shí)際上系統(tǒng)剪貼板中存放的是Transferable對(duì)象集合,程序和系統(tǒng)剪貼板的數(shù)據(jù)交換就是Transferable 對(duì)象的傳遞。程序代碼:
1.新建一個(gè)Project,取名為JClipDemo。
2.新建一個(gè)Application,取名為JClipDemo;主窗口名取名為MainFrame,標(biāo)題為JClipDemo。
3.在MainFrame 類的設(shè)計(jì)窗口中添加一個(gè)JTextArea 組件、兩個(gè)JButton 和一個(gè)JPanel 組件,并且兩個(gè)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(); //創(chuàng)建新的組件 private JTextArea jTextArea1 = new JTextArea(); private JPanel jPanel1 = new JPanel(); private JButton jButton1 = new JButton(); private JButton jButton2 = new JButton(); //剪貼板實(shí)例 Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); …… } |
4.編寫MainFrame 類的初始化方法jbInit(),完成各組件的初始屬性設(shè)置,并為按鈕組件添加事件監(jiān)聽器,具體代碼如下:
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() { //添加事件監(jiān)聽器 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() { //添加事件監(jiān)聽器 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”按鈕的事件處理方法,向系統(tǒng)剪貼板發(fā)送數(shù)據(jù)。
1
2
3
4
|
void jButton1_actionPerformed(ActionEvent e) { StringSelection ss = new StringSelection( this .jTextArea1.getText()); //發(fā)送選中文本到系統(tǒng)剪貼板 cb.setContents(ss,ss); } |
6.編寫“Paste”按鈕的事件處理方法,從系統(tǒng)剪貼板獲得數(shù)據(jù)。
1
2
3
4
5
6
7
8
9
10
11
12
|
void jButton2_actionPerformed(ActionEvent e) { try { Transferable tr = cb.getContents( this ); //從系統(tǒng)剪貼板得到一個(gè)Transferable 對(duì)象 if (tr != null ){ String s = (String) tr.getTransferData(DataFlavor.stringFlavor); //從Transferable 對(duì)象中得到文本數(shù)據(jù) if (s!= null ) this .jTextArea1.insert(s, this .jTextArea1.getCaretPosition()); //在JTextArea 組件中的光標(biāo)所在處插入文本 } } catch (Exception err){ err.printStackTrace(); } } |