问题描述
来自独立应用程序的以下代码可在ubuntu中使用:
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
public class ClipboardTest {
public static void main(String[] args) throws Exception {
Clipboard clipBoard = Toolkit.getDefaultToolkit().getSystemClipboard();
// print the last copied thing
System.out.println(clipBoard.getContents(null).getTransferData(DataFlavor.stringFlavor));
StringSelection data = new StringSelection("NOW");
clipBoard.setContents(data, data);
// prints NOW
System.out.println(clipBoard.getContents(null).getTransferData(DataFlavor.stringFlavor));
}
}
将(Ctrl + V)粘贴到其他应用程序中不会产生任何结果;我希望”NOW”。第二次调用上述代码会产生以下异常:
Exception in thread "main" java.awt.datatransfer.UnsupportedFlavorException: Unicode String
at sun.awt.datatransfer.ClipboardTransferable.getTransferData(ClipboardTransferable.java:160)
作为一个独立的应用程序,即使在2011 security changes之后也应该可以使用。通过Ctrl + C从JTextField内部进行复制,然后将其粘贴到其他地方有效。
在ubuntu 11.04上使用最新的java7(jdk1.7.0_10)和jdk1.6.0_33均未成功;它为should work,并且在使用最新java7的Windows 7上以及在具有java6_37的mac osx 10.6上可以正常工作。还尝试了使用那些javas的xubuntu 12.04,它在那里不起作用。这是linux /ubuntu错误吗?
最佳思路
我在工作中遇到了与应用程序相同的问题,这是我发现的一篇文章,其中解释了原因和可能的解决方案。希望对您有所帮助。
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.
您可以在剪贴板上调用Using gnome library并修复此问题。到目前为止,这是唯一值得尝试的事情。对于GTK,也看到了类似的情况,但仅是在Eclipse的错误中。
次佳思路
我用debian测试(7.0)和openjdk 7u3尝试了您的代码。结果是相同的,但我认为我发现了问题(解决方案)。
剪贴板中的内容仅在存在过程的情况下才有效。如果我将您的代码更改为此:
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();
}
}
如果没有可用内容,则if语句可防止您的代码引发异常,如果您只运行一次代码并且该过程结束,则会发生这种情况。 System.in.read()仅使进程保持活动状态。不按Enter时,我可以粘贴到另一个应用程序中,并且”NOW”可以按预期出来。像这样,代码每次都对我有效。
希望这可以帮助。
第三种思路
问:您是否尝试过以下方法:
gksudo gedit /opt/java/64/jre1.7.0_04/lib/security/java.policy
=>
permission java.awt.AWTPermission "accessClipboard";
也可以看看: