Copying to global clipboard does not work with Java in Ubuntu
I tried your code with debian testing (7.0) and openjdk 7u3. The result is the same, but i think i found the Problem (Solution).
Content in the clipboard is only valid as long as the process exists. It works if i change your code to this:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
public class ClipboardTest {
public static void main(String[] args) throws Exception {
Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();
// print the last copied thing
Transferable t = clipBoard.getContents(null);
if (t.isDataFlavorSupported(DataFlavor.stringFlavor))
System.out.println(t.getTransferData(DataFlavor.stringFlavor));
StringSelection data = new StringSelection("NOW");
clipBoard.setContents(data, data);
// prints NOW
System.out.println(clipBoard.getContents(null).getTransferData(DataFlavor.stringFlavor));
System.in.read();
}
}
The if statement prevent your code from throwing an exception when there is no usable content, which happens if you run your code once and the process ends.
The System.in.read() just keeps the process alive. While not press enter i can paste into another application and "NOW" comes out as expected.
Like this the code works every time for me.
Hope this helps.
Q: Have you tried something like this:
gksudo gedit /opt/java/64/jre1.7.0_04/lib/security/java.policy
=>
permission java.awt.AWTPermission "accessClipboard";
See also:
Copy/Paste not working in a signed Applet
Any workaround to getting Copy/Paste working in JDK 7 AWT Applet on Mac?
http://www.sqlinform.com/forum4/read.php?3,467
Here you can show a test:
A TextArea (its default copy/paste actions works out of the box with any other app on ubuntu)
I have added two buttons which copy and paste from/to system clipboard
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.ActionEvent;
import java.io.IOException;
public class PruebaClipboard {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("Copy/Paste");
frame.getContentPane().setLayout(new BorderLayout());
JPanel btnPanel = new JPanel();
JButton btnCopy = new JButton("copy");
JButton btnPaste = new JButton("paste");
btnPanel.add(btnCopy);
btnPanel.add(btnPaste);
final JTextArea textComp = new JTextArea(7,15);
Action copyAction = new AbstractAction("copy") {
public void actionPerformed(ActionEvent e) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
StringSelection stringSelection = new StringSelection(textComp.getText());
clipboard.setContents(stringSelection, stringSelection);
}
};
btnCopy.setAction(copyAction);
Action pasteAction = new AbstractAction("paste") {
public void actionPerformed(ActionEvent e) {
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
//odd: the Object param of getContents is not currently used
Transferable contents = clipboard.getContents(null);
boolean hasTransferableText = (contents != null) && contents.isDataFlavorSupported(DataFlavor.stringFlavor);
if (hasTransferableText) {
try {
String result = "";
result = (String) contents.getTransferData(DataFlavor.stringFlavor);
textComp.append(result);
} catch (UnsupportedFlavorException ex) {
//highly unlikely since we are using a standard DataFlavor
System.out.println(ex);
ex.printStackTrace();
} catch (IOException ex) {
System.out.println(ex);
ex.printStackTrace();
}
}
}
};
btnPaste.setAction(pasteAction);
frame.getContentPane().add(textComp);
frame.getContentPane().add(btnPanel, BorderLayout.SOUTH);
frame.setSize(new Dimension(400, 300));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
I think you must take care of:
boolean hasTransferableText = (contents != null) && contents.isDataFlavorSupported(DataFlavor.stringFlavor);
And see there is a DataFlavor.plainTextFlavor which maybe is what you need to use (although it is deprecated)
I have tested the code through java 1.4 to java 1.6 on Ubuntu 12.10, but the code where I extract it is in use since ubuntu 9.0 I recall.
I got the same problem with the application at my work and here's an article I've found that explain why and possible solutions. I hope it helps.
Why it happens
Clipboard persistence is a bug that affects many programs under Ubuntu and other X11-based operating systems. Fixing it is a Google Summer of Code 2010 project. Wikipedia has a good overview of the issue. If you want to fix as a user, you can install Parcellite or another clipboard manager. If you want to fix it as a programmer, you can modify your program to conform to the ClipboardManager specification.
X-Window wiki
Using gnome library you could call the store method on the clipboard and fix this. That's the only thing so far that seems to be worth trying. Also saw a similar thing for GTK but only in an Eclipse's bug.