2

我目前正在使用其中包含 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: Reality

<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>
4

1 回答 1

1

根据 Java 文档insertBeforeEnd()

与 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;" >

最后,在你的情况下的原因是

  • 您为父级设置了相同的样式。
于 2013-01-27T11:10:27.563 回答