首先,你要明白,在html中你不能保持“插入符号位置”的逻辑。正如 StanislavL 告诉你的那样,Hello 也可以被 <html><body>Hello</body></html> 翻译,而不是 <html> <body>Hello</body> </html>。在这种情况下,你怎么知道哪个位置对应什么?
错误是尝试将 JTextPane 文本内容与它的 HTML 转换进行比较。相反,您应该将 HTMLDocument 与 DOM 进行比较。所以,首先,你需要一个像 JSoup 这样的 html 解析器。
将 JSoup 添加到项目后,您可以非常轻松地在 html 和 JTextPane 内容之间建立平行关系。
你可以用这个方法获取html:
public static String getHTMLContent(HTMLDocument htmlDoc, int startOffset, int length) {
StringWriter writer = new StringWriter();
try {
new HTMLEditorKit().write(writer, htmlDoc, startOffset, length);
} catch (IOException | BadLocationException ex) {
Logger.getLogger(Editeur.class.getName()).log(Level.SEVERE, null, ex);
}
String html = writer.toString();
return html;
}
然后你可以用 Jsoup 解析它:
Document doc = Jsoup.parse(html);
doc.getElementById("myId");//get the element by its ID
所以,现在,如果您想在生成的 html 中从 HTMLDocument 中定位特定元素,您需要做的是用 <span> 将其包围,您将为其提供 ID,然后使用getElementById。为此,您可以使用HTMLEditorKit.insertHTML:
(new HTMLEditorKit()).insertHTML(htmlDoc, pos, "<span id='myId'>element of interest</span>", 0, 0, Tag.SPAN);
例如,要获取所选文本的位置,您可以这样做:
if (getSelectedText() != null && getSelectedText().length()>0) {
try {
String selectedText = getSelectedText()
htmlDoc.remove(getSelectionStart(), this.getSelectedText().length());
(new HTMLEditorKit()).insertHTML(htmlDoc, pos, "<span id='myId'>"+selectedText+"</span>", 0, 0, Tag.SPAN);
} catch (BadLocationException ex) {
Logger.getLogger(Editeur.class.getName()).log(Level.SEVERE, null, ex);
}
}
现在您可以轻松获得您感兴趣的部分,或者使用 Jsoup 的 getElementById 或 Java 的 HTMLDocument.getElement(id)。
如果需要,我可以提供更多关于具体点的详细信息。