【问题标题】:How to convert the position in JTextPane with HTMLDocument to position in JTextPane string text如何使用 HTMLDocument 将 JTextPane 中的位置转换为 JTextPane 字符串文本中的位置
【发布时间】:2015-10-29 09:13:51
【问题描述】:

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

<html>
   <head>

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

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

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

现在知道了这个位置,我想把这个位置转换成上面写的 html 字符串中的位置(如果我算得好,它又是 94 :)) 该怎么做?

【问题讨论】:

  • 其实不可能。 Html 用于构建文档(模型),但模型不保留原始字符串中的偏移量。想象一下相同的 2 个标签之间有 1 个空格,中间有 2 个空格,没有空格。 HTMLDocument 对于所有 3 种情况都是相同的。
  • 天哪!如果你知道我在这个主题上做了多少工作......但幸运的是,我已经找到了解决方案。我有 2 分钟的时间给你答案

标签: java html string swing jtextpane


【解决方案1】:

首先,你要明白,在html中你不能保持“插入符号位置”的逻辑。正如 StanislavL 告诉你的那样,Hello 也可以被 &lt;html&gt;&lt;body&gt;Hello&lt;/body&gt;&lt;/html&gt; 翻译,而不是 &lt;html&gt; &lt;body&gt;Hello&lt;/body&gt; &lt;/html&gt;。在这种情况下,你怎么知道哪个位置对应什么?

错误是尝试将 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 中定位特定元素,您需要做的是用 &lt;span&gt; 将其包围,您将为其提供 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)

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

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2012-02-06
    相关资源
    最近更新 更多