在圖形用戶界面(GUI)應用中,系統剪貼板是實現程式間數據交換的核心機制。本文詳細介紹如何使用 Java AWT API 實現 Java 程式與系統剪貼板的雙向數據傳輸,包含完整的 Swing 界面示例代碼。
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Toolkit.getDefaultToolkit() 獲取預設工具包實例,無需手動創建對象。
Transferable getContents(Object requester):從剪貼板獲取數據對象void setContents(Transferable contents, ClipboardOwner owner):向剪貼板設置數據Transferable tr = cb.getContents(this);
if (tr != null && tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
String s = (String) tr.getTransferData(DataFlavor.stringFlavor);
if (s != null) {
jTextArea1.insert(s, jTextArea1.getCaretPosition());
}
}
關鍵點:使用 DataFlavor.stringFlavor 指定文本數據格式,通過 getTransferData 獲取字符串內容。
StringSelection ss = new StringSelection(jTextArea1.getText());
cb.setContents(ss, ss);
StringSelection 實現了 Transferable 和 ClipboardOwner 接口,封裝純文本數據。
public class MainFrame extends JFrame {
private JTextArea jTextArea1 = new JTextArea();
private JButton jButton1 = new JButton("Copy");
private JButton jButton2 = new JButton("Paste");
private Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
// ... 組件初始化與佈局代碼
}
// Copy 按鈕事件
void jButton1_actionPerformed(ActionEvent e) {
StringSelection ss = new StringSelection(this.jTextArea1.getText());
cb.setContents(ss, ss);
}
// Paste 按鈕事件
void jButton2_actionPerformed(ActionEvent e) {
try {
Transferable tr = cb.getContents(this);
if (tr != null && tr.isDataFlavorSupported(DataFlavor.stringFlavor)) {
String s = (String) tr.getTransferData(DataFlavor.stringFlavor);
if (s != null) {
this.jTextArea1.insert(s, this.jTextArea1.getCaretPosition());
}
}
} catch (Exception err) {
err.printStackTrace();
}
}
UnsupportedFlavorException、IOException 等潛在異常isDataFlavorSupported 先檢查格式兼容性除純文本外,同樣機制支持:
DataFlavor.imageFlavor)DataFlavor.javaFileListFlavor)Transferable 接口)Java 剪貼板 API 提供了標準化的跨程式數據交換機制,核心在於 Clipboard、Transferable、DataFlavor 三大類的協作。掌握其基本用法後,可輕鬆實現豐富的複製貼上功能,提升應用程式的易用性與互操作性。