带有 HTML 的 JTextPane,为什么某些内联样式属性会被有选择地删除



我目前正在使用一个包含html的JTextPane。我将其内容类型设置为 html,一切正常......或者我是这么想的。

JTextPane的功能是输出段落(带

标签),每个段落都有不同的颜色。每组

标签都配备了一个内联样式属性。

现在我像这样打印

标签:

String myLine = "<P style="color:blue;" +
        "padding-left:25px;" +
        "text-indent:-25px;" +
        "font-family:Courier New;" +
        "font-size:11;"  +
        "">" ;
doc.insertBeforeEnd(body, myLine);

其中doc是JTextPane的JTextPane HTMLDocument,body是我的HTMLDocument中的body元素。

它在 JTextPane 中输出所有内容都很好,文本是蓝色的,快递,11 大小,带有悬挂缩进。完善!

您可能会认为,如果您再次恢复文本,您将看到 P 标签就像您构建它的方式一样。所以我使用 getText() 方法恢复其中的 html:现实

<p style="text-indent: -25px; padding-left: 25px">

当我真正期待看到这个时:期望

<p style="color:blue; text-indent: -25px; padding-left: 25px; font-family:Courier New; font-size:11;">

为什么要这样做?有没有办法避免这种情况?如果我不得不猜测,似乎Java提取了文本属性,以便它可以通过自己的方式更有效地处理这些属性。

但是,我问这个问题的原因是,一旦我开始更深入地自定义我的 JTextPane,着色开始变得不可靠。我宁愿直接在内联样式上拥有属性。

提前感谢您的帮助。


编辑:有人要求在

添加标签

之前和之后查看完整的html输出。

以前:

<html>
  <head>
  </head>
  <body>
  </body>
</html>

现在我在 java 中执行此代码:

String htmlLine = "<p style="color:blue; " +
                             "text-indent: -25px; " +
                             "padding-left: 25px; " +
                             "font-family:Courier New; " +
                             "font-size:11;" >" ;
try {
    doc.insertBeforeEnd(body, htmlLine);
} catch (Exception e) {
    System.err.println(e);
}

后:

<html>
  <head>
  </head>
  <body>
    <p style="text-indent: -23px; padding-left: 25px">
      First Text
    </p>
  </body>
</html>

根据insertBeforeEnd()的Java文档

与 insertAfterEnd 方法不同,新元素将成为指定元素的子元素,而不是同级元素。

这意味着插入的元素正在成为子元素并继承其父级的风格。在内部插入时,HTMLDocument 会从父项中已经存在的子项中删除重复的样式信息。所以这就是你得到的原因

<p style="text-indent: -25px; padding-left: 25px">

而不是

<p style="color:blue;
          text-indent: -25px;
          padding-left: 25px;
          font-family: Courier New;
          font-size:11;" >

最后,您案例中的原因是

  • 您为父级设置了相同的样式。

最新更新