Linux上的Java剪贴板(纯文本),一些程序可以读取,其他程序可以';t、 为什么

Linux上的Java剪贴板(纯文本),一些程序可以读取,其他程序可以';t、 为什么,java,linux,text,clipboard,Java,Linux,Text,Clipboard,当我的基于Java的应用程序(不是基于浏览器的小程序)将纯文本复制到Linux上的系统剪贴板时,许多程序无法访问剪贴板数据,但有些程序可以 下面是我能做的最简单的测试: import java.awt.datatransfer.*; import java.awt.Toolkit; import java.io.*; public final class PasteTest { public static void main (String... args) { String m

当我的基于Java的应用程序(不是基于浏览器的小程序)将纯文本复制到Linux上的系统剪贴板时,许多程序无法访问剪贴板数据,但有些程序可以

下面是我能做的最简单的测试:

import java.awt.datatransfer.*;
import java.awt.Toolkit;
import java.io.*;

public final class PasteTest {
  public static void main (String...  args) {
    String mytext = "This is a test message, testing, 1, 2, 3....";
    StringSelection sel = new StringSelection(mytext);
    Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
    clip.setContents(sel, null);
    try {
      Thread.sleep(1000);
    } catch (Exception e) {
    }
  }
} 
此程序运行时,OpenOffice(LibreOffice 3.5.7.2)中的文件>粘贴可以访问它放在系统剪贴板上的文本。但在Gnome终端、Mozilla Thunderbird&Firefox和许多其他程序中使用File>Paste是不行的。粘贴选项是灰色的,就像剪贴板是空的一样


如何让我的Java程序将纯文本发布到Linux上的系统剪贴板(在Ubuntu 12.04上进行测试),以便所有程序都可以访问它?

您的代码很好。它的问题是终止得太快

在X window系统下,将某些内容放入“剪贴板”(即名为“剪贴板”的选择)的进程必须保持活动状态,才能使复制的数据继续存在。()

当进程运行时,也就是说,
sleep()
s,您可以将数据粘贴到任何位置。一旦终止,剪贴板将变空

这不是Java的特殊行为;您可以使用
charmap
或任何其他您不介意关闭的程序轻松复制它

我不知道LibreOffice在你的测试中是怎么得分的。它可能是alt+tab列表中的第一个。在我的测试中,LibreOffice的行为与任何其他应用程序一样:“粘贴”在Java进程处于活动状态时工作,在进程终止时停止工作


在一般情况下,我不知道如何修复它。运行剪贴板管理器(可以记住多个复制的项目,因此可能拥有所有项目)可能会有所帮助。

Mozilla、gedit或terminal中的鼠标中键做什么?通常它是从不同的X剪贴板粘贴的。也许您的数据会进入其中?它不会进入X11选择的“剪贴板”。示例代码演示了这个问题。您使用的是OpenJDK还是Sun的JDK?我注意到基于Java的程序粘贴到终端时出现了一个问题,我发现改变JDK是一个可能的解决方案。我现在在Ubuntu18.04中看到了一个持续运行的Java进程的问题。@StefanReich:在某些情况下,我能够用Firefox和Emacs重现类似的问题;两者都可能“丢失”复制到剪贴板的任何新数据,并保留以前的值。我怀疑这可能是X服务器内部的一个问题,非常罕见,以至于没有人有资源来重新编程和修复它。在我的情况下,我不能从Java复制到Gnome终端。。。