問題描述
來自獨立應用程序的以下代碼可在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";
也可以看看: