首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 系統剪貼板操作:文字複製/貼上、DataFlavor、ClipboardOwner

     編輯:Java 程式設計入門

核心 API

  • Toolkit.getDefaultToolkit().getSystemClipboard():取得系統剪貼板單例。
  • Clipboard.setContents(Transferable, ClipboardOwner):放入資料。
  • Clipboard.getContents(Object):取出資料。
  • StringSelection:實現 Transferable 的文字封裝類。
  • DataFlavor.stringFlavor:純文字 MIME 類型。

完整範例:Copy / Paste 按鈕

public class ClipboardDemo extends JFrame {
    private final JTextArea txtArea = new JTextArea();
    private final Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

    public ClipboardDemo() {
        setLayout(new BorderLayout());
        add(new JScrollPane(txtArea), BorderLayout.CENTER);

        JPanel pnl = new JPanel();
        JButton btnCopy = new JButton("Copy");
        JButton btnPaste = new JButton("Paste");
        pnl.add(btnCopy); pnl.add(btnPaste);
        add(pnl, BorderLayout.SOUTH);

        btnCopy.addActionListener(e -> copyToClipboard());
        btnPaste.addActionListener(e -> pasteFromClipboard());

        setSize(400, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void copyToClipboard() {
        String text = txtArea.getSelectedText();
        if (text == null) text = txtArea.getText(); // 無選取則全選
        StringSelection ss = new StringSelection(text);
        clipboard.setContents(ss, ss); // ClipboardOwner 同為 StringSelection
    }

    private void pasteFromClipboard() {
        try {
            Transferable t = clipboard.getContents(this);
            if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                String s = (String) t.getTransferData(DataFlavor.stringFlavor);
                txtArea.insert(s, txtArea.getCaretPosition());
            }
        } catch (Exception ex) { ex.printStackTrace(); }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new ClipboardDemo().setVisible(true));
    }
}

ClipboardOwner 介面

當剪貼板內容被其他程式覆寫時,JVM 會回呼 lostOwnership(Clipboard, Transferable)。應用可在此釋放資源、更新 UI 狀態 (如「剪貼板內容已變更」提示)。

class MyClipboardOwner implements ClipboardOwner {
    public void lostOwnership(Clipboard clipboard, Transferable contents) {
        System.out.println("剪貼板所有權已轉移");
    }
}

進階:支援圖片/檔案/HTML

  • 圖片:`new ImageSelection(bufferedImage)` (需自行實現 `Transferable` 包裝 `DataFlavor.imageFlavor`)。
  • 檔案清單:`new FileListSelection(List)` (支援 `DataFlavor.javaFileListFlavor`),可跨應用拖曳/貼上檔案。
  • HTML 片段:實現 `Transferable` 回傳 `text/html` Flavor,支援富文字編輯器互通。

常見坑點

  1. 無頭模式 (Headless):伺服器環境無圖形介面會拋 `HeadlessException`,需 `-Djava.awt.headless=true` 或避免調用。
  2. 大資料效能:剪貼板儲存大量文字/圖片會佔用系統記憶體,建議大資料改用暫存檔 + 檔案清單 Flavor。
  3. 跨平台換行符:Windows `\r\n`、Linux `\n`、Mac 老版 `\r`,貼上時建議正規化為系統預設。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved