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

标签 java html text clipboard mime-types

我需要使用 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());
        }
    }

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

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

最佳答案

所以,经过一番尝试(并阅读更新的 JavaDocs)。基本答案是。

  1. 您需要提供“纯文本”和“html 文本”值
  2. 您需要提供多种数据风格,每种风格代表您愿意导出的数据类型
  3. 您需要根据风格(以及风格所需的导出方法)从 getTransferData 返回适当的数据

请注意

此示例导出两个不同的字符串,一个是纯文本,一个是 HTML,这是故意的,以便更容易看到不同的消费者何时使用不同的文本。显然,如果您愿意,您可以使用 html 格式的文本。

enter image description here

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),这在...中进行了演示。

关于java - 如何使用 Java 将 text/html 和 text/plain 复制到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71550362/

相关文章:

javascript - HTML5 移动应用程序在手机屏幕关闭时运行?

html - 谷歌字体无法使用,l​​ato 和 raleway

java - 第一次调用一个方法,当数据有变化时再次调用该方法

java - Java如何获取目录的最新文件

javascript - 动态改变图像上的文本颜色

android - Robotium 搜索 setError 的编辑文本

java - 如何用 Java 编写保存按钮的功能?

javascript - 创建带有文本选择 anchor 的 URL

java - 如何通过单击菜单项来更改 fragment 的文本

java - 使用 InSequence 注释时出现 arquillian UnsupportedOperationException