【问题标题】:JTextPane with HTML, Why do certain inline style attributes get selectively removed?带有 HTML 的 JTextPane,为什么某些内联样式属性会被选择性地删除?
【发布时间】:2013-01-27 10:24:35
【问题描述】:

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

【问题讨论】:

  • 你能显示插入新东西之前文档中的html字符串吗?

标签: java html styles jtextpane


【解决方案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;" >

最后你的原因是

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

【讨论】:

  • 不幸的是,我认为这不是原因。是的,

    成为

    标记的子标记,但是,我从未将任何样式应用于 body 标记(内联或样式表)。因此,样式不是重复的。也不会解释为什么下一个带有红色字体颜色的

    块也被剥夺了这些样式属性(因为那时第二种颜色不可能是第一种颜色的副本,因为它们是不同的)。谢谢你的努力!

  • OK 那么你的输入和总输出是多少?我太好奇了,不知道。
  • Sri,我编辑了帖子以包含您的要求。不过,我正在学习,编译器会重新排列和组织 html 代码(同样,可能以某种方式进行优化)。如果我在段落中添加带有颜色属性的 标记,它实际上会删除样式属性并添加 标记。
  • @Erik 我认为这种行为是因为 java 只支持 html 3.2。
  • 你说得对,Sri,java 的 html 支持阻碍了许多较新的 css 属性。感谢您的帮助。
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多