Как скопировать text/html и text/plain в буфер обмена с помощью Java

Мне нужно установить содержимое буфера обмена с помощью java-приложения, чтобы пользователю были доступны два типа MIME. Это позволит пользователю вставить нужную версию текста.

Я нашел пример, который относится к JavaScript, я надеюсь, что для Java есть эквивалент.

Пример JavaScript:

const blob = new Blob([
    '<a href = "https://stackoverflow.com/">goto stack</a>'
], { type: "text/html" });
const blobPlain = new Blob(['goto stack'], { type: "text/plain" });

navigator.clipboard.write([
    new ClipboardItem({
        [blob.type]: blob,
        [blobPlain.type]: blobPlain
    },),
])

По сути, это то, что у меня есть в моем Java-приложении:

import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Clipboard;

public class tester{

 public static void main(String[] args){

     // from string to clipboard
    StringSelection selection = new StringSelection("hi");
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(selection, selection);
 }
}

Я знаю, как установить содержимое с помощью строки «text/plain» или строки «text/html». Приведенный выше пример Java поместит строку простого текста в буфер обмена, его можно легко изменить, чтобы вместо этого поместить текст в формате HTML в буфер обмена, но только один или другой, а не оба.

Если я использую следующий код, я могу получить содержимое буфера обмена как передаваемый объект, а затем установить в буфере обмена этот же передаваемый объект.

@Override
    public void run() {
        try {
                Transferable trans = systemClipboard.getContents(this);
                setThisOwner(trans);
                ClipboardMonitor.sleep(sleepInterval);
            }
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    

    private void setThisOwner(Transferable clipContents) {
        try {
            systemClipboard.setContents(clipContents, this);
        } catch (Exception ex) {
            System.out.println(ex.toString());
        }
    }

Вышеупомянутое бесполезно, поскольку мой вопрос здесь касается, но код, кажется, указывает мне, что должен быть способ делать то, что я хочу. Если бы я мог, например, создать собственный «Переносимый» и поместить его в «setContents ()»?

Есть ли способ поместить в буфер обмена как обычный текст, так и строки HTML?

Вам нужно предоставить несколько DataFlovor, каждый из которых описывает стиль контента, который они поддерживают, для пример; пример

MadProgrammer 20.03.2022 21:39

Спасибо @MadProgrammer - я уже реализовал что-то похожее на первый пример, второй пример, похоже, охватывает именно ту функциональность, которую я ищу. Я собираюсь попытаться понять это и реализовать, если это сработает, я укажу это здесь и отмечу это как ответ

RHSkinner 20.03.2022 21:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, немного поигравшись (и почитав обновленные JavaDocs). Основной ответ таков.

  1. Вам необходимо указать как значение «обычный текст», так и значение «текст html».
  2. Вам нужно предоставить несколько вариантов данных, каждый из которых представляет тип данных, которые вы хотите экспортировать.
  3. Вам нужно вернуть соответствующие данные из getTransferData в зависимости от вкуса (и желаемого метода экспорта вкусов)

Пожалуйста, обрати внимание

В этом примере экспортируются две разные строки, одна — обычный текст, а другая — HTML, это сделано намеренно, чтобы было легче увидеть, когда разные пользователи используют разный текст. Очевидно, вы могли бы использовать текст в формате html для обоих, если хотите.

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.util.ArrayList;
import java.util.List;

public final class Main {
    public static void main(String[] args) {

        String plainText = "Hello World";
        String htmlText = "<html><body><h1>This is a test</h1></body></html>";

        HtmlSelection htmlSelection = new HtmlSelection(htmlText, plainText);
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        clipboard.setContents(htmlSelection, null);
    }

    public static class HtmlSelection implements Transferable {

        private static List<DataFlavor> htmlFlavors = new ArrayList<>(3);

        static {
                htmlFlavors.add(DataFlavor.stringFlavor);
                htmlFlavors.add(DataFlavor.allHtmlFlavor);
        }

        private String html;
        private String plainText;

        public HtmlSelection(String html, String plainText) {
            this.html = html;
            this.plainText = plainText;
        }

        public DataFlavor[] getTransferDataFlavors() {
            return (DataFlavor[]) htmlFlavors.toArray(new DataFlavor[htmlFlavors.size()]);
        }

        public boolean isDataFlavorSupported(DataFlavor flavor) {
            return htmlFlavors.contains(flavor);
        }

        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {

            String toBeExported = plainText;
            if (flavor == DataFlavor.stringFlavor) {
                toBeExported = plainText;
            } else if (flavor == DataFlavor.allHtmlFlavor) {
                toBeExported = html;
            }

            if (String.class.equals(flavor.getRepresentationClass())) {
                return toBeExported;
            }
            throw new UnsupportedFlavorException(flavor);
        }
    }
}

Вы также должны помнить, что некоторые приложения могут предпочесть другой метод экспорта (например, через Reader или InputStream), это показано в...

Ты сумасшедший! Это круто! Большое спасибо!

RHSkinner 22.03.2022 13:46

Другие вопросы по теме