Nano Hash - криптовалюты, майнинг, программирование

Буфер обмена Java в Linux (только текст), некоторые программы могут его читать, а другие нет, почему

Когда мое приложение на основе 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 Terminal, Mozilla Thunderbird и Firefox и многих других программах этого сделать нельзя. Опция «Вставить» выделена серым цветом, как будто буфер обмена пуст.

Как я могу заставить свою Java-программу публиковать обычный текст в системный буфер обмена в Linux (тестирование на Ubuntu 12.04), чтобы все программы могли получить к нему доступ?

21.04.2013

  • Что делает средняя кнопка мыши в Mozilla, gedit или терминале? Обычно он вставляется из другого буфера обмена X. Может ваши данные идут туда? 21.04.2013
  • Он не попадает в буфер обмена выбора X11. Пример кода демонстрирует проблему. 21.04.2013
  • Вы используете OpenJDK или Sun JDK? Я заметил проблему со вставкой программ на основе Java в терминал и столкнулся с изменением JDK в качестве возможного решения здесь. 27.11.2013

Ответы:


1

Ваш код в порядке. Его проблема в том, что он заканчивается слишком рано.

В системе X Window процесс, который помещает что-то в «буфер обмена» (то есть выделение с именем «буфер обмена»), должен оставаться в живых, чтобы скопированные данные сохранились. (Прочитайте об активных и пассивных буферах и обратите внимание, что выборки относятся к активному типу).

Пока работает ваш процесс, то есть sleep()с, вы можете вставлять данные куда угодно. После завершения буфер обмена становится пустым.

Это не особое поведение Java; вы можете легко воспроизвести его с помощью charmap или любой другой программы, которую вы не против закрыть.

Я не знаю, как LibreOffice набрал балл в вашем тесте. Возможно, он был первым в вашем списке Alt+Tab. В моих тестах LibreOffice вел себя как любое другое приложение: «вставка» работала до тех пор, пока был жив процесс Java, и переставала работать, когда процесс завершался.

Я не знаю, как это исправить в общем случае. Запуск диспетчера буфера обмена (который запоминает несколько скопированных элементов и, следовательно, вероятно, владеет ими всеми) может помочь.

22.04.2013
  • Это правда, но в целом причина не в этом. Я вижу проблему прямо сейчас в Ubuntu 18.04 с постоянно работающим процессом Java. 14.11.2019
  • @StefanReich: при определенных обстоятельствах мне удавалось воспроизвести аналогичную проблему с Firefox и Emacs; любой из них может пропустить любые новые данные, скопированные в буфер обмена, и остаться с каким-то предыдущим значением. Я подозреваю, что это может быть проблема внутри X-сервера, достаточно редкая, чтобы ни у кого не было ресурсов для ее воспроизведения и исправления. 14.11.2019
  • Возможный. В моем случае я не могу скопировать с Java на терминал Gnome... 14.11.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..