如何使用 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)。基本答案是。
- 您需要同时提供“纯文本”和“html 文本”值
- 您需要提供多种数据类型,每种类型代表您愿意导出的数据类型
- 您需要根据口味(以及所需的口味导出方法)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);
}
}
}
您还应注意,某些应用程序可能更喜欢不同的导出方法(即通过 Reader
或 InputStream
),这在...
中得到了证明
- Copy jTable row with its grid lines into excel/word documents
我需要使用 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)。基本答案是。
- 您需要同时提供“纯文本”和“html 文本”值
- 您需要提供多种数据类型,每种类型代表您愿意导出的数据类型
- 您需要根据口味(以及所需的口味导出方法)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);
}
}
}
您还应注意,某些应用程序可能更喜欢不同的导出方法(即通过 Reader
或 InputStream
),这在...
- Copy jTable row with its grid lines into excel/word documents