4

当我基于 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 以及许多其他程序中使用文件 > 粘贴是不行的。粘贴选项是灰色的,就像剪贴板是空的一样。

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

4

1 回答 1

5

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

在 X 窗口系统下,将某些内容放在“剪贴板”(即名为“剪贴板”的选择)上的进程必须保持活动状态,以便复制的数据能够存活。(阅读主动和被动缓冲区,并注意选择是主动类型的)。

当您的进程运行时,即sleep()s,您可以将数据粘贴到任何地方。一旦它终止,剪贴板就会变空。

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

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

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

于 2013-04-22T00:16:25.313 回答