當前位置: 首頁>>技術教程>>正文


複製到全局剪貼板不適用於Ubuntu中的Java

, , , ,

問題描述

來自獨立應用程序的以下代碼可在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錯誤嗎?

Related question

最佳思路

我在工作中遇到了與應用程序相同的問題,這是我發現的一篇文章,其中解釋了原因和可能的解決方案。希望對您有所幫助。

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並修複此問題。到目前為止,這是唯一值得嘗試的事情。對於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";

也可以看看:

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/9716.html,未經允許,請勿轉載。