好的,
我发现问题肯定在HTMLWriter
类中。不幸的是,他们没有让覆盖这个类变得容易,但我相信我已经解决了。
import java.io.IOException;
import java.io.Writer;
import java.util.Enumeration;
import java.util.Vector;
import javax.swing.text.AttributeSet;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.html.CSS;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLWriter;
public class FixedHTMLWriter extends HTMLWriter
{
private Vector tags = new Vector(10);
private Vector tagValues = new Vector(10);
private Vector tagsToRemove = new Vector(10);
private MutableAttributeSet convAttr = new SimpleAttributeSet();
private MutableAttributeSet oConvAttr = new SimpleAttributeSet();
public FixedHTMLWriter(Writer w, HTMLDocument doc, int pos, int len)
{
super(w, doc, pos, len);
}
AttributeSet convertToHTML(AttributeSet from, MutableAttributeSet to)
{
if (to == null)
{
to = convAttr;
}
to.removeAttributes(to);
if (from != null)
{
Enumeration keys = from.getAttributeNames();
String value = "";
while (keys.hasMoreElements())
{
Object key = keys.nextElement();
if (key instanceof CSS.Attribute)
{
value += key + ": " + from.getAttribute(key) + ";";
if (keys.hasMoreElements())
value += " ";
}
else
{
to.addAttribute(key, from.getAttribute(key));
}
}
if (value.length() > 0)
{
to.addAttribute(HTML.Attribute.STYLE, value);
}
}
return to;
}
@Override
protected void closeOutUnwantedEmbeddedTags(AttributeSet attr) throws IOException
{
tagsToRemove.removeAllElements();
attr = convertToHTML(attr, null);
HTML.Tag t;
Object tValue;
int firstIndex = -1;
int size = tags.size();
for (int i = size - 1; i >= 0; i--)
{
t = (HTML.Tag) tags.elementAt(i);
tValue = tagValues.elementAt(i);
if ((attr == null) || noMatchForTagInAttributes(attr, t, tValue))
{
firstIndex = i;
tagsToRemove.addElement(t);
}
}
if (firstIndex != -1)
{
boolean removeAll = ((size - firstIndex) == tagsToRemove.size());
for (int i = size - 1; i >= firstIndex; i--)
{
t = (HTML.Tag) tags.elementAt(i);
if (removeAll || tagsToRemove.contains(t))
{
tags.removeElementAt(i);
tagValues.removeElementAt(i);
}
write('<');
write('/');
write(t.toString());
write('>');
}
size = tags.size();
for (int i = firstIndex; i < size; i++)
{
t = (HTML.Tag) tags.elementAt(i);
write('<');
write(t.toString());
Object o = tagValues.elementAt(i);
if (o != null && o instanceof AttributeSet)
{
writeAttributes((AttributeSet) o);
}
write('>');
}
}
}
private boolean noMatchForTagInAttributes(AttributeSet attr, HTML.Tag t, Object tagValue)
{
if (attr != null && attr.isDefined(t))
{
Object newValue = attr.getAttribute(t);
if ((tagValue == null) ? (newValue == null) : (newValue != null && tagValue.equals(newValue)))
{
return false;
}
}
return true;
}
@Override
protected void writeEmbeddedTags(AttributeSet attr) throws IOException
{
attr = convertToHTML(attr, oConvAttr);
Enumeration names = attr.getAttributeNames();
while (names.hasMoreElements())
{
Object name = names.nextElement();
if (name instanceof HTML.Tag)
{
HTML.Tag tag = (HTML.Tag) name;
if (tag == HTML.Tag.FORM || tags.contains(tag))
{
continue;
}
write('<');
write(tag.toString());
Object o = attr.getAttribute(tag);
if (o != null && o instanceof AttributeSet)
{
writeAttributes((AttributeSet) o);
}
write('>');
tags.addElement(tag);
tagValues.addElement(o);
}
}
}
@Override
protected void writeAttributes(AttributeSet attr) throws IOException
{
convAttr.removeAttributes(convAttr);
convertToHTML(attr, convAttr);
Enumeration names = convAttr.getAttributeNames();
while (names.hasMoreElements())
{
Object name = names.nextElement();
if (name instanceof HTML.Tag || name instanceof StyleConstants || name == HTML.Attribute.ENDTAG)
{
continue;
}
write(" " + name + "=\"" + convAttr.getAttribute(name) + "\"");
}
}
}
您需要覆盖HTMLEditorKit
类的方法write
,如下所示:
public void write(Writer out, Document doc, int pos, int len) throws IOException, BadLocationException
else if (doc instanceof StyledDocument)
else
}
通过调用setEditorKit
,将被覆盖的HTMLEditorKit
设置在JEditorPane
上。
BODY
元素定义了哪些样式?为什么要同时使用'verdana'和'Verdana'字符串来设置字体?请注意:1)<a name=..
是锚点,而<a href..
只是一个链接。2)JEP在使用百分比指定大小时存在固有问题。3)很少有开发人员认为JEP适用于除了精心控制和非常有限的HTML/CSS之外的任何内容。看起来你正在试图将其推向设计极限以外的领域。 - Andrew ThompsonsetText()
之前和之后执行getText()
时查看返回的内容吗?在执行getText()
后,可见的即显示的样式是否会发生变化? - Carl Smotricz