81

I want to set the user's clipboard to a string in a Java console application. Any ideas?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
clone1018
  • 1,207
  • 2
  • 10
  • 13

5 Answers5

149

Use the Toolkit to get the system clipboard. Create a StringSelection with the String and add it to the Clipboard.

Simplified:

StringSelection selection = new StringSelection(theString);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(selection, selection);
Neuron
  • 5,141
  • 5
  • 38
  • 59
user85421
  • 28,957
  • 10
  • 64
  • 87
  • It didn't work for me, the clipboard was cleared. I'm using Linux. – Searene Apr 14 '19 at 10:24
  • it should, maybe consider the second comment on original question, or rado's [answer](https://stackoverflow.com/a/11059985/85421) below – user85421 Apr 14 '19 at 14:35
37

Here is a simple SSCCE to accomplish this:

import java.awt.*;
import java.awt.datatransfer.*;
import java.io.*;

class ClipboardTest
{
    public static void main(String[] args)
        throws UnsupportedFlavorException, IOException
    {
        Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
        StringSelection testData;

        //  Add some test data

        if (args.length > 0)
            testData = new StringSelection( args[0] );
        else
            testData = new StringSelection( "Test Data" );

        c.setContents(testData, testData);

        //  Get clipboard contents, as a String

        Transferable t = c.getContents( null );

        if ( t.isDataFlavorSupported(DataFlavor.stringFlavor) )
        {
            Object o = t.getTransferData( DataFlavor.stringFlavor );
            String data = (String)t.getTransferData( DataFlavor.stringFlavor );
            System.out.println( "Clipboard contents: " + data );
        }

        System.exit(0);
    }
}
ryvantage
  • 13,064
  • 15
  • 63
  • 112
camickr
  • 321,443
  • 19
  • 166
  • 288
11

For anyone still stumbling upon this post searching for the JavaFX way to accomplish this, here you go:

ClipboardContent content = new ClipboardContent();
content.putString("Some text");
content.putHtml("<b>Bold</b> text");
Clipboard.getSystemClipboard().setContent(content);

For further information, read the documentation.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
xeruf
  • 2,602
  • 1
  • 25
  • 48
3

If you are on Linux and using OpenJDK, it will not work. You must use the Sun JDK on Linux for it to work.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
rado
  • 4,040
  • 3
  • 32
  • 26
1

In Linux with xclip:

Runtime run = Runtime.getRuntime();
Process p = null;
String str = "hello";
try {
        p = run.exec(new String[]{"sh", "-c", "echo " + str + " | xclip -selection clipboard"});
}
catch (Exception e) {
    System.out.println(e);
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • What if the string contains end-of-line characters? Will it work then? – Peter Mortensen Feb 09 '18 at 23:36
  • 5
    that really defeats the idea of a multi platform programming language.. – Neuron Mar 21 '18 at 18:45
  • This is lacking any kind of sanitation. Please don't use this in production code. If someone copies the string `" rm -rf $HOME`, you've just deleted their home directory. Also, I believe Ubuntu doesn't come with xclip by default. – Sean Oct 19 '21 at 18:01