gpt4 book ai didi

java - 如何将带有 HTMLDocument 的 JTextPane 中的位置转换为 JTextPane 字符串文本中的位置

转载 作者:行者123 更新时间:2023-11-28 01:26:33 29 4
gpt4 key购买 nike

我在 java swing 中有一个应用程序包含 JTextPaneHTMLDocument。假设我将 Pane 的文本设置为:

<html>
<head>

</head>
<body>
<p style="margin-top: 0">
I have a problem now.
</p>
</body>
</html>

所以我看到了“我现在有问题”的文字。在 Pane 上。

假设我单击了一个 Pane ,插入符号设置在“问题”字词的“p”和“r”之间。在这种情况下,如果我在我的 JTextPane 上调用 getCaretPosition,它将返回 10(如果我算得好 :))。

现在知道这个位置我想把这个位置转换成上面写的 html 字符串中的位置(如果我算得好的话又是 94 :) )如何做到这一点?

最佳答案

首先,你要明白在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);
}
}

现在您可以轻松获得您感兴趣的零件或使用getElementById来自 Jsoup,或通过 HTMLDocument.getElement(id)来自 Java。

如果需要,我可以提供有关具体点的更多详细信息。

关于java - 如何将带有 HTMLDocument 的 JTextPane 中的位置转换为 JTextPane 字符串文本中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31852083/

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