本文實例講述了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(); } }