【发布时间】:2021-10-15 09:32:11
【问题描述】:
我正在用 Java Swing 创建一个 HTML 编辑器。它使用带有 text/html MIME 类型的JEditorPane。我有一种情况,我有以下 HTML 结构:
<body>
<p>This is a <b>BOLD</b> word in a sentence</p>
</body>
当光标放在该句子中并且有人单击“列表”按钮时,HTML 会通过创建一个新列表来修改,其中包含光标的段落作为第一个列表项。像这样:
<body>
<ol>
<li>
<p>This is a <b>BOLD</b> word in a sentence</p>
</li>
</ol>
</body>
到目前为止,我可以让它工作,以便创建列表元素,但我无法将粗体标签插入到新列表中的正确位置。换句话说,我可以创建列表项,但粗体标签不见了。
我需要某种方法来获取 Element 对象(在本例中为段落对象)的内部或外部 HTML,以便我可以完整地复制内容,包括粗体标记。到目前为止我只能复制
里面的文字标签,不包括粗体标签。
到目前为止,这是我的代码。这是在扩展的编辑器窗格对象中。 htmlDoc_ 是编辑器窗格的HTMLDocument。
public void toggledListButton() {
// turning the paragraph into a list
// get the paragraph element, cursor should always be inside
// a paragraph somewhere
Element elem = htmlDoc_.getParagraphElement( this.getCaretPosition() );
int caretPos = this.getCaretPosition();
int elemStart = elem.getStartOffset();
int elemEnd = elem.getEndOffset();
String elemText = "" ;
try {
elemText = htmlDoc_.getText(elemStart, elemEnd - elemStart);
} catch (BadLocationException e1) {
e1.printStackTrace();
}
try {
htmlDoc_.setOuterHTML(elem, "<ol><li><p>" + elemText + "</p></li></ol>");
} catch (BadLocationException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
// amount of text doesnt change, so we can just set the caretPos where it was
this.setCaretPosition(caretPos);
this.requestFocusInWindow();
}
如果我能以某种方式获得“elem”元素的内部 HTML,我想我将拥有我需要插入到新列表中的内容。要么将元素传递给 JSoup 并以这种方式提取 HTML,但我不知道如何将元素传递给 JSoup。
编辑-----
根据下面关于迭代元素的评论,我进行了这个更改,以使用“elem”变量尝试循环遍历段落中的每个子元素,并以这种方式构建段落的 html。问题是它似乎没有将标签检测为单独的元素,它只检测到 3 个文本/叶子元素。
String paragraphHTML = "";
for (int i = 0; i < elem.getElementCount(); i++) {
Element child = elem.getElement(i);
if (child.isLeaf()) {
try {
paragraphHTML += child.getDocument().getText(0, child.getDocument().getLength());
} catch (BadLocationException e) {
e.printStackTrace();
}
} else {
paragraphHTML += "<" + child.getName() + ">";
}
}
System.out.println("paragraphHTML=" + paragraphHTML);
ParagraphHTML 仅作为不包括标签的文本输出。我将如何检测标签?谢谢
【问题讨论】:
-
你好幸运。谢谢你的评论。这太有趣了。我会试一试,告诉你进展如何
-
嗯,有人早些时候发表了评论并建议我尝试循环遍历孩子。对此的帮助将不胜感激。谢谢
-
之前有人发表了评论 - 如果您需要帮助,那么关于发布 minimal reproducible example 的评论是相关的。所有问题都应包含 MRE,以便我们准确了解您在做什么。有些人可能知道答案。如果没有,有些人如果有 MRE 可以工作,他们会花时间帮助解决问题。
标签: java swing jeditorpane