When using Scala (or Java, Kotlin, or other JVM languages), and (a) you want to put a String on the system clipboard and/or (b) get a String off the system clipboard — i.e., copying and pasting text strings — I just used these functions, and can confirm that they work:
import java.awt.Toolkit
import java.awt.datatransfer.StringSelection
import java.awt.datatransfer.DataFlavor
def putStringOnClipboard(text: String): Unit =
val stringSelection = new StringSelection(text)
val clipboard = Toolkit.getDefaultToolkit.getSystemClipboard
clipboard.setContents(stringSelection, null)
def getStringFromClipboard: Option[String] =
try
val clipboard = Toolkit.getDefaultToolkit.getSystemClipboard
val contents = clipboard.getContents(null)
if contents != null && contents.isDataFlavorSupported(DataFlavor.stringFlavor) then
Some(contents.getTransferData(DataFlavor.stringFlavor).asInstanceOf[String])
else
None
catch
case e: Exception =>
System.err.println("Error getting string from clipboard: " + e.getMessage)
None
You put a String on the system clipboard like this:
putStringOnClipboard(""Hello, clipboard world")
and you get a String off the system clipboard like this:
val clipboardText = getStringFromClipboard
clipboardText match
case Some(text) => println(s"Clipboard contains: $text")
case None => println("Yikes! Clipboard does not contain a string or is empty")
As shown, this allows you to copy text to the system clipboard and then paste text from the system clipboard using JVM languages like Scala, Java, Kotlin, and others.
A key to this solution is that I only intend for these to work with text — i.e., the String data type. If you want it to work with other data types that may be on the system clipboard, you’ll have to handle that differently (and I’m leaving that as an exercise for the reader).

