我需要使用 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)。基本答案是。
- 您需要提供“纯文本”和“html 文本”值
- 您需要提供多种数据风格,每种风格代表您愿意导出的数据类型
- 您需要根据风格(以及风格所需的导出方法)从
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
),这在...中进行了演示。
关于java - 如何使用 Java 将 text/html 和 text/plain 复制到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71550362/