当前位置: 首页>>技术教程>>正文


复制到全局剪贴板不适用于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/article/9716.html,未经允许,请勿转载。