gpt4 book ai didi

java - 使用 html 制作 JEditorPane 将正确格式化的文本放入剪贴板

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:05 24 4
gpt4 key购买 nike

我有这段代码来演示问题:

public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new JEditorPane("text/html", "Hello cruel world<br>\n<font color=red>Goodbye cruel world</font><br>\n<br>\nHello again<br>\n"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

如果您在应用程序启动后选择了出现在框架中的所有文本,您可以将其复制并粘贴到 MS Word、Apple 的 Pages 或 Mail 中,并且文本格式正确。但是,如果您将其粘贴到纯文本编辑器(如 TextEdit、Smultron 或 Skype 聊天窗口)中,则所有粘贴的内容都在一行中。

我该怎么做才能使复制到剪贴板的文本能够在粘贴时保留换行符?

我在 Mac OS X 10.7 上运行我的代码

最佳答案

在没有得到答案后,我卷起袖子做了很多研究和学习。解决方案是为组件制作一个自定义的 TransferHandler,并手动处理 HTML 文本。解决所有这些问题并不容易,这可能是我得到零答案的原因。

这是一个可行的解决方案:

import javax.swing.*;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;

public class ScratchSpace {

public static void main(String[] args) {
final JFrame frame = new JFrame();
final JEditorPane pane = new JEditorPane("text/html", "<html><font color=red>Hello</font><br>\u2663<br>World");
pane.setTransferHandler(new MyTransferHandler());
frame.getContentPane().add(pane);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

}

class MyTransferHandler extends TransferHandler {

protected Transferable createTransferable(JComponent c) {
final JEditorPane pane = (JEditorPane) c;
final String htmlText = pane.getText();
final String plainText = extractText(new StringReader(htmlText));
return new MyTransferable(plainText, htmlText);
}

public String extractText(Reader reader) {
final ArrayList<String> list = new ArrayList<String>();

HTMLEditorKit.ParserCallback parserCallback = new HTMLEditorKit.ParserCallback() {
public void handleText(final char[] data, final int pos) {
list.add(new String(data));
}

public void handleStartTag(HTML.Tag tag, MutableAttributeSet attribute, int pos) {
}

public void handleEndTag(HTML.Tag t, final int pos) {
}

public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, final int pos) {
if (t.equals(HTML.Tag.BR)) {
list.add("\n");
}
}

public void handleComment(final char[] data, final int pos) {
}

public void handleError(final String errMsg, final int pos) {
}
};
try {
new ParserDelegator().parse(reader, parserCallback, true);
} catch (IOException e) {
e.printStackTrace();
}
String result = "";
for (String s : list) {
result += s;
}
return result;
}


@Override
public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException {
if (action == COPY) {
clip.setContents(this.createTransferable(comp), null);
}
}

@Override
public int getSourceActions(JComponent c) {
return COPY;
}

}

class MyTransferable implements Transferable {

private static final DataFlavor[] supportedFlavors;

static {
try {
supportedFlavors = new DataFlavor[]{
new DataFlavor("text/html;class=java.lang.String"),
new DataFlavor("text/plain;class=java.lang.String")
};
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}

private final String plainData;
private final String htmlData;

public MyTransferable(String plainData, String htmlData) {
this.plainData = plainData;
this.htmlData = htmlData;
}

public DataFlavor[] getTransferDataFlavors() {
return supportedFlavors;
}

public boolean isDataFlavorSupported(DataFlavor flavor) {
for (DataFlavor supportedFlavor : supportedFlavors) {
if (supportedFlavor == flavor) {
return true;
}
}
return false;
}

public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (flavor.equals(supportedFlavors[0])) {
return htmlData;
}
if (flavor.equals(supportedFlavors[1])) {
return plainData;
}
throw new UnsupportedFlavorException(flavor);
}
}

关于java - 使用 html 制作 JEditorPane 将正确格式化的文本放入剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7745087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com