Toolkit.getDefaultToolkit().getSystemClipboard():取得系統剪貼板單例。Clipboard.setContents(Transferable, ClipboardOwner):放入資料。Clipboard.getContents(Object):取出資料。StringSelection:實現 Transferable 的文字封裝類。DataFlavor.stringFlavor:純文字 MIME 類型。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));
}
}
當剪貼板內容被其他程式覆寫時,JVM 會回呼 lostOwnership(Clipboard, Transferable)。應用可在此釋放資源、更新 UI 狀態 (如「剪貼板內容已變更」提示)。
class MyClipboardOwner implements ClipboardOwner {
public void lostOwnership(Clipboard clipboard, Transferable contents) {
System.out.println("剪貼板所有權已轉移");
}
}