Java Clipboard on Linux (text only),有的程序可以读,有的不能,为什么

标签 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 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 上测试)以便所有程序都可以访问它?

最佳答案

您的代码没问题。它的问题是它终止得太早了。

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

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

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

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

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

关于Java Clipboard on Linux (text only),有的程序可以读,有的不能,为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16131205/

相关文章:

Python urllib.urlretrieve 和用户代理

c++ - 初学者 C++ - 打开一个文本文件进行阅读,如果它存在,如果不存在,则将其创建为空

text - 崇高 : How can I jump n lines with the keyboard arrows?

java - 使用运行时异常

java - 子类忽略方法的具体实现?

php - 如何从 PHP cli 获取 linux 控制台 $COLUMNS 和 $ROWS?

html - text-align center 不是在 h1 和 h2 上居中文本

java - Jasper 报告错误 : compiler class not found : org. codehaus.mojo.jasperreports.MavenJavacCompiler

java - 如何使用 Play 控制 URL 中日期的格式?

linux - sed 命令未按预期工作