复制到全局剪贴板不适用于Ubuntu中的Java

Kar*_*ell 24 java ubuntu swing copy-paste awt

独立应用程序中的以下代码适用于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));
    }

}
Run Code Online (Sandbox Code Playgroud)

将(Ctrl + V)粘贴到不同的应用程序中不会产生任何结果; 我期待"现在".再次调用上面的代码会产生以下异常:

Exception in thread "main" java.awt.datatransfer.UnsupportedFlavorException: Unicode String
    at sun.awt.datatransfer.ClipboardTransferable.getTransferData(ClipboardTransferable.java:160)
Run Code Online (Sandbox Code Playgroud)

作为一个独立的应用程序,这应该工作,即使经过2011安全更改.从JTextField内部通过Ctrl + C进行复制,然后粘贴到其他地方.

使用最新的java7(jdk1.7.0_10)和jdk1.6.0_33在ubuntu 11.04上都没有成功; 它应该工作,并在Windows 7上使用最新的java7和使用java6_37的mac osx 10.6上按预期工作.还尝试了xubuntu 12.04与那些javas,它在那里不起作用.这是一个linux/ubuntu错误吗?

相关问题

Jon*_*eau 17

我在工作中遇到了与应用程序相同的问题,这是我发现的一篇文章,解释了原因和可能的解决方案.我希望它有所帮助.

为什么会这样

剪贴板持久性是一个影响Ubuntu和其他基于X11的操作系统下的许多程序的错误.修复它是Google Summer of Code 2010项目.维基百科对此问题有一个很好的概述.如果要以用户身份进行修复,可以安装Parcellite或其他剪贴板管理器.如果要将其修复为程序员,可以修改程序以符合ClipboardManager规范.

X-Window维基

使用gnome库,您可以在剪贴板上调用store方法并修复它.到目前为止,这是唯一值得尝试的东西.还看到了GTK类似的东西,但只是在Eclipse的bug中.


raf*_*ael 12

我用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

if语句会阻止您的代码在没有可用内容时抛出异常,如果您运行一次代码并且该过程结束,则会发生这种情况.
System.in.read()只是让进程保持活动状态.虽然没有按回车,我可以粘贴到另一个应用程序,"现在"按预期出现.
像这样,代码每次都适合我.

希望这可以帮助.