我目前正在使用一个包含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;" >
最后,您案例中的原因是
- 您为父级设置了相同的样式。