如何使用 Java 将 text/html 和 text/plain 复制到剪贴板

How to copy text/html and text/plain to clipboard using Java

我需要使用 java 应用程序设置剪贴板内容,以便用户可以使用两种 MIME 类型。这将允许用户粘贴他们想要的文本版本。

我找到了一个适用于 JavaScript 的示例,我希望 Java.

有一个等效的示例

Java脚本示例:

const blob = new Blob([
    '<a href="https://whosebug.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());
        }
    }

就我的问题而言,以上内容没有用,但代码似乎向我表明应该有一种方法可以做我想做的事。例如,如果我可以创建一个自定义“Transferable”并将其放入“setContents()”?

有没有办法可以将纯文本和 HTML 字符串都放入剪贴板?

因此,经过一些尝试(并阅读了更新的 JavaDocs)。基本答案是。

  1. 您需要同时提供“纯文本”和“html 文本”值
  2. 您需要提供多种数据类型,每种类型代表您愿意导出的数据类型
  3. 您需要根据口味(以及所需的口味导出方法)return 来自 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);
        }
    }
}

您还应注意,某些应用程序可能更喜欢不同的导出方法(即通过 ReaderInputStream),这在...

中得到了证明
  • Copy jTable row with its grid lines into excel/word documents