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

时间:2013-01-27 10:24:35

标签: java html styles 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尺寸,带有悬挂缩进。 PERFECT!

您会认为,如果您再次恢复文本,您会看到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>

1 个答案:

答案 0 :(得分:1)

根据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;" >

最后你原因的原因是

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