gpt4 book ai didi

java - 内联复制粘贴 JEditorPane HTML

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:48 26 4
gpt4 key购买 nike

我拼命尝试在 HTML 模式下的 JTextPane 中实现自定义复制/粘贴。大部分工作正常,我使用 EditorKit.write() 获取 html 内容,使用 editorKit.read() 粘贴它。完美世界。

但是,当我有: <p> test </p>在我的编辑器中,我尝试复制“es”以获得 <p> tesest </p> ,我得到的是

<p>tes</p>
<p>es</p>
<p>t</p>

知道这一点,我正在尝试找出一种方法来“内联”粘贴应该内联的部分,并在 block 中粘贴复制过程中位于 block 中的部分。通常,

如果我有:

<p>mon beau sapin</p>
<p>roi des forêts</p>
<p>que j'aime ta verdure</p>

如果我复制:

beau sapin</p>
<p>roi des forêts</p>
<p>que

并将其粘贴在“mon”之后,我希望:

<p>mon beau sapin</p>
<p>roi des forêts</p>
<p>que beau sapin</p>
<p>roi des forêts</p>
<p>que j'aime ta verdure</p>

我得到的是:

<p>mon</p>
<p>beau sapin</p>
<p>roi des forêts</p>
<p>que</p>
<p>beau sapin</p>
<p>roi des forêts</p>
<p>que j'aime ta verdure</p>

我尝试了各种方法,例如删除 <p></p>的第一行和最后一行(EditorKit.read自己将其添加回来),使用editorKit.insertHTML(但是我应该放置什么样的标签?),逐行插入(大多数时候,我在另一个 p 中获得 p )等。

但真正的问题是不可能在htmlDocument中写出你想要的内容。我该怎么写sapin</p> <p>roi在指定位置?编辑器套件.read ?它将添加 <p>sapin</p> <p>roi</p>Editorkit.insertHTML ?我需要精确的包装标签...

我向你展示我的最后一次尝试:

    private static void insertHTMLContent(JMathTextPane jtp, String html, int offset) {
Document doc = Jsoup.parse(html);
Elements elts = doc.body().children();
//unwrap the last and first element
if(elts.size()>2) { elts.last().unwrap(); }
if(elts.size()>=1) { elts.first().unwrap(); }
//We add a fake DIV element and remove it just at the next line
editorKit.insertHTML(jtp.htmlDoc, offset, "<div id='copie'>"+doc.body().html()+"</div>", 0, 0, HTML.Tag.DIV);
jtp.getHTMLdoc().setOuterHTML(jtp.getHTMLdoc().getElement("copie"),doc.body().html());
}

我无法向您展示结果:EditorKit.write 尝试自行修复 html。但 HTMLDocument 完全困惑。

供您尝试:

public class Test {

private static JTextPane editor = new Editor();
private static JMenuBar menu = new Menu();
private static String clipboard = "";

private static Action copy = new Copy();
private static Action paste = new Paste();

public static void main(String[] args) {
JFrame f = new JFrame();
f.setContentPane(editor);
f.setJMenuBar(menu);
f.setSize(600, 400);
f.setVisible(true);
}

public static class Editor extends JTextPane {
public Editor() {
this.setDocument(new HTMLDocument());
this.setEditorKit(new HTMLEditorKit());
}
}

public static class Menu extends JMenuBar {
public Menu() {
add(new JButton(copy));
add(new JButton(paste));

getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_DOWN_MASK), "copy");
getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_DOWN_MASK), "paste");
getActionMap().put("copy", copy);
getActionMap().put("paste", paste);
}
}

public static class Copy extends AbstractAction {
public Copy() {super("copy");}
@Override
public void actionPerformed(ActionEvent e) {
StringWriter w = new StringWriter();
try {
editor.getEditorKit().write(w, editor.getDocument(), editor.getCaretPosition(), editor.getSelectedText().length());
} catch (Exception ex) {Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);}
clipboard = w.toString();
}
}
public static class Paste extends AbstractAction {
public Paste() {super("paste");}
@Override
public void actionPerformed(ActionEvent e) {
try {
editor.getEditorKit().read(new StringReader(clipboard), editor.getDocument(), editor.getCaretPosition());
} catch (Exception ex) {Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);}
}
}
}

抱歉我太长了。我接受任何帮助。

最佳答案

恐怕没有简单的方法。当您粘贴时,您希望保留原始段落并避免添加新的 <p>创造,对吗?问题是当前段落和复制的段落可能具有不同的属性。例如。当前为左对齐,但复制的为右对齐。

案件如何解决?为了简化该套件,只需创建 <p>元素。

您可以尝试从剪贴板内容创建一个独立的 HTMLDocument,并迭代文档的结构,提取元素(段落和文本)并将它们插入到原始文档中。

关于java - 内联复制粘贴 JEditorPane HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437440/

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