【问题标题】:Getting title attribute when <span> inside <span> with javax.swing.text.StyledDocument使用 javax.swing.text.StyledDocument 在 <span> 内获取 <span> 时的标题属性
【发布时间】:2014-04-13 15:41:04
【问题描述】:

我将此文本设置为JTextPane,内容类型为text/html

<!doctype html>
<html>
  <head><title>Test document</title></head>
  <body style="font-family:monospace">
    <p title="t1" style="color: #FF0000;">
      This is <span title="t2" style="color: #00FF00;">new <span style="color: #0000FF;">more</span> title</span> test
    </p>
  </body>
</html>

我的目标是在鼠标悬停时让标题属性显示为工具提示。我了解到可以覆盖 JTextPane.getToolTipText(MouseEvent event) 并使用 JTextComponent.viewToModel(Point pt)

到目前为止,This istest 显示工具提示 t1newtitle 显示工具提示 t2,正如预期的那样。

但是,当我将鼠标悬停在单词 more 上时,我无法检索到 title="t2";相反,它显示工具提示t1

使用JEditorPaneStructureTool,我得到了这个结构:

内部结构似乎有些问题。

有什么方法可以得到正确的title属性吗?

【问题讨论】:

  • 恐怕不可能。正如您在工具中看到的那样,DOM 结构中没有跨度。相反,每个跨度都被转换为具有自己的一组属性的 LeafElement。属性具有对父级的引用,并显示 P 的标题。是否可以避免跨度跨度?
  • 我对这个问题的结论是javax.swing.text.html.HTMLDocument 只能处理非常简单的结构;我刚刚发现具有多个 class 的元素没有正确呈现。我必须使 HTML 文档尽可能简单(目前)。

标签: java html swing jtextpane


【解决方案1】:

知道 HTMLDocument 的局限性,我看到了解决这个问题的窍门。尝试用以下字体替换您的外部跨度:

    This is <font title="t2" style="color: #00FF00;">new <span style="color: #0000FF;">more</span> title</font> test

我很确定它会起作用。给这些字体一个特定的类。这样,您可以在导出 html 内容时将它们恢复为 span。

【讨论】:

  • 感谢您的回答。它适用于给定的 HTML。但是,由于 HTMLDocument 的基本限制,当 HTML 文档变得“更复杂”时,此技巧将不起作用......
  • 我不能说...这在很大程度上取决于您要达到的目标。确实 HTMLDocument 非常有限,但我设法找到了几乎所有这些限制的技巧,现在它可以按预期工作。但确实大多数其他人只是切换到 JavaFX 组件。祝你好运。
猜你喜欢
  • 2018-06-29
  • 2012-10-10
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多