当前位置: 首页 > 知识库问答 >
问题:

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

徐学潞
2023-03-14

我需要使用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()”中?

是否有一种方法可以在剪贴板中放置纯文本和超文本标记语言字符串?

共有1个答案

赵佐
2023-03-14

所以,在玩了一会儿(并阅读了更新的JavaDocs)之后。基本答案是。

  1. 您需要同时提供“纯文本”和“html文本”值

这个例子导出了两个不同的字符串,一个是纯文本,一个是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);
        }
    }
}

您还应该注意,一些应用程序可能更喜欢不同的导出方法(即通过读取器输入流),这在以下示例中得到了说明。。。

  • 将jTable行及其网格行复制到excel/word文档中
  • 将JTextArea复制为"text/html"DataFlavor
 类似资料:
  • 问题内容: 我正在寻找一个如何将文本复制到iOS剪贴板的干净示例,然后可以在其他应用程序中使用/粘贴该文本。 此功能的优点是可以快速复制文本,而无需传统文本复制的标准文本突出显示功能。 我假设键类在其中,但是在它们提供的代码示例中找不到相关的区域。 问题答案: 如果您只需要纯文本,则可以使用属性。它既可读又可写: (从剪贴板中 读取数据时 ,UIPasteboard文档还建议您首先检查一下,“以避

  • 问题内容: 如何将BufferedImage存储到系统剪贴板中? 问题答案: 这是从这里获得的工作代码,已成功测试

  • 大家好,我正在尝试使用jquery复制textbox值,但我不想使用add on插件,这里是我的代码 我无法复制文本值。请帮助我

  • 问题内容: 当我尝试使用粘贴到单元格时,我要粘贴的单元格保持空白,但setValueAt()似乎可以正常工作。另外,当我尝试从一个单元格剪切或复制JPopupMenu时,如果要粘贴到另一个单元格,则我的“粘贴”选项将保持禁用状态。我不知道为什么。我的代码如下。 Here’s my code for 问题答案: 根据您的示例代码,并且必须填写空白,它对 我有用… Now, maybe you’d l

  • 问题内容: 首先,关于SO将图像复制到python中的剪贴板的问题导致答案用PIL和win32clipboard将图像写入python中的Windows剪贴板?,这仅对Python 2.x有用。-我尝试过,但是没有用。我克服了一个问题:Python 3.0中没有StringIO和cStringIO模块 ,但是碰到了另一个: 因此,对于Python 3再次提出相同的问题-如何在Python 3中将图

  • 问题内容: 这是我在用户单击此按钮时的代码: 如何在此div中复制文本? 问题答案: JAVASCRIPT: