Мне нужно установить содержимое буфера обмена с помощью 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 ()»?
Есть ли способ поместить в буфер обмена как обычный текст, так и строки HTML?
Спасибо @MadProgrammer - я уже реализовал что-то похожее на первый пример, второй пример, похоже, охватывает именно ту функциональность, которую я ищу. Я собираюсь попытаться понять это и реализовать, если это сработает, я укажу это здесь и отмечу это как ответ




Итак, немного поигравшись (и почитав обновленные JavaDocs). Основной ответ таков.
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), это показано в...
Ты сумасшедший! Это круто! Большое спасибо!
Вам нужно предоставить несколько
DataFlovor, каждый из которых описывает стиль контента, который они поддерживают, для пример; пример