【问题标题】:Java Clipboard on Linux (text only), some programs can read it, others can't, whyLinux 上的 Java 剪贴板(纯文本),有些程序可以读取,有些则不能,为什么
【发布时间】:2013-04-21 12:41:34
【问题描述】:

当我基于 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 上测试),以便所有程序都可以访问它?

【问题讨论】:

  • Mozilla、gedit 或终端中的鼠标中键有什么作用?通常它从不同的 X 剪贴板粘贴。也许你的数据在那里?
  • 它不会转到 X11 选择“剪贴板”。示例代码演示了问题。
  • 您使用的是 OpenJDK 还是 Sun 的 JDK?我注意到粘贴到终端的基于 Java 的程序存在问题,我发现将 JDK 作为可能的解决方案here

标签: java linux text clipboard


【解决方案1】:

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

在 X 窗口系统下,将某些内容放在“剪贴板”上的进程(即名为“剪贴板”的选择)必须保持活动状态,以便复制的数据能够存活。 (Read about active and passive buffers, and notice that selections are of the active kind)。

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

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

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

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

【讨论】:

  • 这是真的,但总的来说不是原因。我现在在 Ubuntu 18.04 中看到了这个问题,它有一个持续运行的 Java 进程。
  • @StefanReich:在某些情况下,我能够在 Firefox 和 Emacs 中重现类似的问题;要么可能“错过”复制到剪贴板的任何新数据并坚持使用以前的值。我怀疑这可能是 X 服务器内部的问题,非常罕见,以至于没有人有资源来重现和修复它。
  • 可能的。就我而言,我无法从 Java 复制到 Gnome 终端...
猜你喜欢
  • 2017-01-27
  • 2020-07-25
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多